Members: Eva Lijnen, Chaja Swab, Willemijn Dietz, Veerle van Citters, Noa Zijlmans
Student numbers: 4570812, 4661753, 5868130, 5871026, 4957024
The objective of this research is to gain insight into the effects of COVID-19 on the air passenger transport in The Netherlands. The COVID-19 pandemic has severely impacted society globally. To stop the spread and minimise the effects of the virus, borders were closed, affecting air traffic activity. This resulted in the following research question:
How did COVID-19 affect the passenger air traffic in the Netherlands?
To answer this question properly, a number of sub-questions has been drawn up:
Subquestion 1
How has the number of new Covid-19 cases developed in the considered time in the Netherlands?
Hypothesis: It is expected that the number of Covid infections is dependent on seasonality and the regualtions in place.
Subquestion 2
How has the number of air traffic passengers developed in the considered time in the Netherlands?
Hypothesis: It is expected that the number of passengers is dependent on the governmental regulations in place. In times of strict regulations, it is expected that the number of air passengers is low. When Covid-19 measurements were low, it is expected that the number of passengers is broadly comparable to the number of passengers before Covid-19.
Subquestion 3
Are there relative differences in the development of air traffic passengers between the considered airports in the Netherlands?
Hypothesis: Tt is expected that airports with a relatively high number of local flights will ultimately have been affected the least, as they are less dependent on restrictions related to international travel. According to the database, Groningen Airport Eelde operates most local flights and therefore would be expected to be least affected by the restrictions overall.
Subquestion 4
How has COVID-19 impacted air traffic from and to various regions / continents?
Hypothesis: It is expected that number of air passengers on intercontinental flights has been more affected than the number of air passengers on European flights.
Time scope: January 2018 - August 2022 2018 is considered to be the base case scenario. The impact of COVID-19 on the number of passenger is measured by comparing a given month in the pandemic with the corresponding month in the base case scenario.
Spatial scope: All passengers related to the following airports in The Netherlands fall inside the research scope: Amsterdam Airport Schiphol, Rotterdam The Hague Airport, Eindhoven Airport, Maastricht Aachen Airport and Groningen Airport Eelde. It has been decided to consider the number of passenger instead of flights. The reasoning behind this is that the number of flights might not be representative as airlines operated empty flights in order to keep their airport slot during COVID-19 (NOS, 2022).
Definitions: As stated in the reasearch question, only passenger air traffic is considered; cargo and mail air traffic fall outside the scope of this research. Moreover, the hypothesis is that mail and cargo air traffic have been less affected by COVID-19. As previously stated, passenger air traffic is measured in number of passenger (not in number of flights).
This sections provides an overview of important COVID-19 regulations regarding air traffic between February 2020-May 2022 (Ministerie van Algemene Zaken, 2022). An extensive overview of the relevant regulations can be found in the Appendix.
## Here al the necessairy libary's are imported
%matplotlib notebook
from urllib.request import urlopen
from plotly.offline import init_notebook_mode
import plotly.express as px
import plotly.graph_objects as go
import json
import pandas as pd
import numpy as np
import itertools
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import plotly.io as pio
#import geopandas as gpd
from plotly.graph_objs import *
##The first datafile is loaded in here
filepath = '/Users/zijlm/Project-TIL6022-Group-21/Monthly_figures_on_aviation_10102022_111323.csv'
#filepath = '/Users/evalijnen/Documents/Python/Monthly_figures_on_aviation_10102022_111323.csv'
airtraffic_df = pd.read_csv(filepath, sep=";")
Filtered and prepared the data. Use of new_cases_smoothed --> justification based on source. New cases smoothed is used so the cases are on the rightful days instead of the information processing delay Only Covid-19 measurements that have a direct impact on travelling, have been considered in this subquestion.
# Import world Covid Data
filepath2 = '/Users/zijlm/Project-TIL6022-Group-21/owid-covid-data.csv'
covid_world_df = pd.read_csv(filepath2, sep=",")
# Convert date column into datetime format
covid_world_df['date'] = pd.to_datetime(covid_world_df['date'],
format='%Y-%m-%d %H:%M:%S')
covid_world_df
# Preparing the full data set for further use
# Filtering on Covid new cases for the Netherlands
covid_nl_total_df = covid_world_df[
covid_world_df['location'] == 'Netherlands'
]
# Filtering for relevant columns and dropping NAN cells
covid_nl_df = covid_nl_total_df.iloc[:, [2,3,6]]
covid_nl_clean_df = covid_nl_df.dropna()
covid_nl_clean_df
| location | date | new_cases_smoothed | |
|---|---|---|---|
| 139328 | Netherlands | 2020-03-03 | 5.429 |
| 139329 | Netherlands | 2020-03-04 | 11.714 |
| 139330 | Netherlands | 2020-03-05 | 18.143 |
| 139331 | Netherlands | 2020-03-06 | 26.000 |
| 139332 | Netherlands | 2020-03-07 | 36.429 |
| ... | ... | ... | ... |
| 140268 | Netherlands | 2022-09-29 | 1751.857 |
| 140269 | Netherlands | 2022-09-30 | 2200.857 |
| 140270 | Netherlands | 2022-10-01 | 2200.857 |
| 140271 | Netherlands | 2022-10-02 | 2200.857 |
| 140272 | Netherlands | 2022-10-03 | 2200.571 |
945 rows × 3 columns
In January 2020, the House of Representatives in the Netherlands was informed about the first COVID-19 infection in Wuhan in China (Ministerie van Algemene Zaken, 2022). The virus started spreading quite quickly to the rest of the world, and by the end of January the first cases in Italy were already detected. From now on, it was only a matter of time before the first infection in the Netherlands would be detected. Since the lack of knowledge of the virus and the degree of impact it had on people’s health, governments came together to take swift action.
The graph below shows the development of the reported new COVID-19 cases in the Netherlands in the period March 2020 to September 2022. The data is collected from OurWorldInData.org (Mathieu et al, 2020). Due to lack of test availability, there is no data available for the month February and therefore this has been left out of the scope. Although the hypothesis is that there have been some cases by then. The data is measured by day and will therefore be shown per day. Due to the slight delay in testing and test results, the data is smoothed over the days and therefore some numbers are given in decimals. In the graph, three types of dotted lines are shown, these lines indicate whether the government was taking measures or not. This data is collected from RIVM (Tijdlijn Van Coronamaatregelen, n.d.).
The hypothesis is that the number of new cases is mainly dependent on the seasonality and the active regulations. It is expected that the number of infections is higher in winter than in summer. Additionally, it is assumed that measures taken by the government will impact the number of infections in terms of steepness of the slopes and eventually will cause the peaks to become lower, especially when it comes to introducing a (partial) lockdown.
# The figure is scaled for the max and the min value of the new cases smoothed
# New cases smoothed is used so the cases are on the rightful days instead of the information processing delay
dmax = covid_nl_clean_df['new_cases_smoothed'].values.max()
dmin = covid_nl_clean_df['new_cases_smoothed'].values.min()
fig = go.Figure()
# Figure contains lineplot of the new covid cases in NL
# The following hover data is added to each line: date and number of new cases
fig.add_trace(go.Scatter(x=covid_nl_clean_df.date,
y=covid_nl_clean_df['new_cases_smoothed'],
mode='lines', name='New Covid Cases NL',
hovertemplate='Date: %{x: "%m/%d/%Y}'+'<br>New Cases: %{y: "%m/%d/%Y}'))
# Multiple vertical lines indicating a significant change in Covid measurements
# Measurements considered: (partial) lockdown and easening of measurements
# The line color indicates the type of measurement
# Same type of measurements are grouped in the legend
# The following hover data is added to each line: date and number of new cases
fig.add_trace(go.Scatter(x=['2020-03-15','2020-03-15'],
y=[dmin,dmax], mode='lines',
line=dict(color='red', width=2, dash='dash'),
legendgroup='Lockdown', name='Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}'))
fig.add_trace(go.Scatter(x=['2020-12-14','2020-12-14'],
y=[dmin,dmax], mode='lines',
line=dict(color='red', width=2, dash='dash'),
legendgroup='Lockdown', name='Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2021-12-19','2021-12-19'],
y=[dmin,dmax], mode='lines',
line=dict(color='red', width=2, dash='dash'),
legendgroup='Lockdown', name='Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2020-10-10','2020-10-10'],
y=[dmin,dmax], mode='lines',
line=dict(color='orange', width=2, dash='dash'),
legendgroup='Partial Lockdown', name='Partial Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}'))
fig.add_trace(go.Scatter(x=['2020-06-01','2020-06-01'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate='Date: %{x: "%m/%d/%Y}'))
fig.add_trace(go.Scatter(x=['2021-06-26','2021-06-26'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2021-02-08','2021-02-08'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2022-01-10','2022-01-10'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate ='Date: %{x: "%m/%d/%Y}', showlegend=False))
# The figure is updated with titles and a legend is added
fig.update_layout(title='New Covid Cases in the Netherlands',
xaxis_title='Date', yaxis_title='New Cases Smoothed')
fig.update_layout(legend=dict(groupclick='toggleitem'))
fig.layout.plot_bgcolor='#f0f5f5'
fig.show()
From the graph, it becomes clear that the governments took measures in times of a steep increase in new COVID-19 cases. As a result, the peaks took place in a short period of time after introducing a (partial) lockdown. Vice versa, measures were eased in times of a decreasing number of new cases. In January 2022 this resulted in a significant peak in the number of new cases. However, the number of hospitalizations did not increase and as such there was no reason to tighten the measures.
When looking at the seasons, it seems that as it gets colder outside, i.e. from October onwards, there are more new cases every year. Vice versa, when the temperature gets warmer, i.e. from May onwards, the number of new cases seems to decrease. However, in July 2021 there is a peak in new cases even though this is during midsummer. This can be explained by the fact that measures were eased quite quickly by that time because of the high vaccination rate. After the fast-growing number of new cases, the government decided to tighten the measures again.
# Convert Periods column to datetime
# This one needs to be uncommenten en then again ###
airtraffic_df['Periods'] = airtraffic_df['Periods'].str.replace('*', '')
airtraffic_df['Periods'] = pd.to_datetime(airtraffic_df['Periods'], format='%Y %B',
errors='coerce')
airtraffic_df['Periods']
# Select rows that fall within our timespan
at_df_timespan = airtraffic_df[airtraffic_df['Periods']>='2018-01-01']
at_df_timespan
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\1017535499.py:3: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will *not* be treated as literal strings when regex=True.
| Airports | Periods | Aircraft movements/Cross-country flights (number) | Aircraft movements/Local flights (number) | Commercial air traffic/Flights/All flights/Total flights (number) | Commercial air traffic/Flights/All flights/Scheduled (number) | Commercial air traffic/Flights/All flights/Non-scheduled (number) | Commercial air traffic/Flights/Arrivals/Total arrivals flights (number) | Commercial air traffic/Flights/Arrivals/Scheduled (number) | Commercial air traffic/Flights/Arrivals/Non-scheduled (number) | ... | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Africa/South Africa (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/America (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/North America (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/Central America (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/America/South America (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/Asia (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/West Asia (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/South-East Asia (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Asia/North-East Asia (ton) | Commercial air traffic/Mail/Country of origin/destination mail/Intercontinental mail/Oceania (ton) | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 235 | Total Dutch airports | 2018-01-01 | 43441 | 3468 | 41247 | 40059 | 1188 | 20616 | 20040 | 576 | ... | 6 | 715 | 483 | 77 | 155 | 562 | 84 | 137 | 341 | 0 |
| 236 | Total Dutch airports | 2018-02-01 | 41665 | 4709 | 39014 | 37874 | 1140 | 19513 | 18966 | 547 | ... | 6 | 543 | 352 | 63 | 128 | 447 | 77 | 109 | 262 | 0 |
| 237 | Total Dutch airports | 2018-03-01 | 47967 | 4637 | 44687 | 43426 | 1261 | 22333 | 21712 | 621 | ... | 7 | 665 | 452 | 71 | 141 | 552 | 105 | 122 | 325 | 0 |
| 238 | Total Dutch airports | 2018-04-01 | 50660 | 5442 | 47362 | 45456 | 1906 | 23688 | 22717 | 971 | ... | 4 | 563 | 354 | 73 | 137 | 577 | 105 | 83 | 388 | 0 |
| 239 | Total Dutch airports | 2018-05-01 | 54882 | 5095 | 51151 | 48500 | 2651 | 25563 | 24249 | 1314 | ... | 4 | 555 | 333 | 73 | 149 | 525 | 97 | 81 | 347 | 0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1765 | Groningen Airport Eelde | 2022-04-01 | 1029 | 4076 | 62 | 0 | 62 | 32 | 0 | 32 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1766 | Groningen Airport Eelde | 2022-05-01 | 1043 | 4264 | 120 | 0 | 120 | 57 | 0 | 57 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1767 | Groningen Airport Eelde | 2022-06-01 | 1260 | 5606 | 148 | 0 | 148 | 78 | 0 | 78 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1768 | Groningen Airport Eelde | 2022-07-01 | 1114 | 5362 | 132 | 0 | 132 | 67 | 0 | 67 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1769 | Groningen Airport Eelde | 2022-08-01 | 1131 | 5378 | 135 | 0 | 135 | 65 | 0 | 65 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
336 rows × 104 columns
The graph below displays the number of air traffic passengers at the different airports in the Netherlands, as well as total the number of passengers in the Netherlands. This is shown over a timespan between 2018 until 2022. Moreover, important events, like the start of COVID-19 in the world, during these years are illuminated. The data is retrieved from Centraal Bureau voor de Statistiek (2022). The data comprises monthly figures, i.e. the monthly number of air passengers is measured at the first day of the given month.
The hypothesis for this sub question is that the number of passengers is dependent on the governmental measures in place. In times of strict COVID-19 measures, it is expected that the number of air passengers is low. In times of low measures, it is expected that the number of passengers is broadly comparable to the number of passengers before COVID-19.
%matplotlib inline
# Rename columns
at_df_timespan.rename(columns={'Commercial air traffic/Passengers/Total passengers/Total passengers (number)':'Total Passengers'}, inplace=True)
# Show basic figure via plotly for the amount of air traffic passengers over time
dmax = at_df_timespan['Total Passengers'].values.max()
dmin = at_df_timespan['Total Passengers'].values.min()
fig = px.line(at_df_timespan, x='Periods',
y='Total Passengers',
color='Airports', title='Amount of air traffic passengers')
# Show the normal summer peak
fig.add_annotation(x='2018-07-01', y=0.93, yref='paper',
text='Annual summer peak', font_size=8, ax=90, ay=-50)
fig.add_annotation(x='2019-07-01', y=0.93, yref='paper',
text='Annual summer peak', font_size=8, ax=50, ay=-35)
# Shows the start of covid and the different moments of lockdowns / easing of measurments
fig.add_annotation(x='2020-03-01', y=0.35, yref='paper', text='COVID in Europe',
font_size=8, ax=-60, ay=-40)
fig.add_trace(go.Scatter(x=['2020-03-01','2020-03-01'],
y=[dmin,dmax], mode='lines',
line=dict(color='red', width=2, dash='dash'),
legendgroup='Lockdown', name='Lockdown in NL + Europe',
hovertemplate ='Date: %{x: "%m/%d/%Y}'))
fig.add_trace(go.Scatter(x=['2020-12-14','2020-12-14'],
y=[dmin,dmax], mode='lines',
line=dict(color='red', width=2, dash='dash'),
legendgroup='Lockdown', name='Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2021-12-19','2021-12-19'],
y=[dmin,dmax], mode='lines',
line=dict(color='red', width=2, dash='dash'),
legendgroup='Lockdown', name='Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2020-10-10','2020-10-10'],
y=[dmin,dmax], mode='lines',
line=dict(color='orange', width=2, dash='dash'),
legendgroup='Partial Lockdown', name='Partial Lockdown',
hovertemplate='Date: %{x: "%m/%d/%Y}'))
fig.add_trace(go.Scatter(x=['2020-06-01','2020-06-01'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate='Date: %{x: "%m/%d/%Y}'))
fig.add_trace(go.Scatter(x=['2021-06-26','2021-06-26'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2021-02-08','2021-02-08'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.add_trace(go.Scatter(x=['2022-01-10','2022-01-10'],
y=[dmin,dmax], mode='lines',
line=dict(color='green', width=2, dash='dash'),
legendgroup='Easening of Measures', name='Easening of Measures',
hovertemplate ='Date: %{x: "%m/%d/%Y}', showlegend=False))
fig.update_layout(title='Amount of air traffic passengers',
xaxis_title='Periods', yaxis_title='Total passengers')
fig.update_layout(legend=dict(groupclick='toggleitem'))
fig.show()
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\1146178119.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
From the graph it can be concluded that the largest drop in air traffic passengers took place in February-March 2020. Around May 2020, there is a significant increase again, after which it decreases in August. Furthermore, there is a small increase in November 2020, followed by a decline in December. Around spring 2021 the number of air traffic passengers grows significantly but declines again in October. In January 2022, the number of passengers increases again and in July 2022, the number of air traffic passengers is almost at pre-COVID levels.
When comparing this to the active regulations, it can be seen that there was a temporary ban on passenger flights from risk areas in March 2020. Moreover, in Mid-March a no-fly zone on the BES -islands and other countries was implemented. In addition, in April only a limited number of flights took place. This is clearly displayed by the first large drop in the graph. During summertime, some restrictions were lifted, resulting in the increase around May. The discouragement to travel to orange and red colored countries and the only-necessary travel advice is reflected by the decreasing number of passengers around August-December 2020. The increase during spring 2021 can be explained by the fact that travel to countries with low levels of infections was allowed. Also, the possibility to travel within the EU with a negative test result, vaccination, or proof of recovery, is a possible explanations for the increase in air traffic passengers. The drop in October 2021 can be explained by the ban on certain flights. The rise of the Omicron variant is a possible explanation for the decreasing number of passengers in end-2021. Lastly, in March 2022, almost all the regulations were dropped, which explains the increase in the graph.
# Import world Covid Data
filepath2 = '/Users/zijlm/Project-TIL6022-Group-21/owid-covid-data.csv'
covid_world_df = pd.read_csv(filepath2, sep=",")
# Convert date column into datetime format
covid_world_df['date'] = pd.to_datetime(covid_world_df['date'],
format='%Y-%m-%d %H:%M:%S')
covid_world_df
# Preparing the full data set for further use
# Filtering on Covid new cases for the Netherlands
covid_nl_total_df = covid_world_df[
covid_world_df['location'] == 'Netherlands'
]
# Filtering for relevant columns and dropping NAN cells
covid_nl_df = covid_nl_total_df.iloc[:, [2,3,6]]
covid_nl_clean_df = covid_nl_df.dropna()
covid_nl_clean_df
| location | date | new_cases_smoothed | |
|---|---|---|---|
| 139328 | Netherlands | 2020-03-03 | 5.429 |
| 139329 | Netherlands | 2020-03-04 | 11.714 |
| 139330 | Netherlands | 2020-03-05 | 18.143 |
| 139331 | Netherlands | 2020-03-06 | 26.000 |
| 139332 | Netherlands | 2020-03-07 | 36.429 |
| ... | ... | ... | ... |
| 140268 | Netherlands | 2022-09-29 | 1751.857 |
| 140269 | Netherlands | 2022-09-30 | 2200.857 |
| 140270 | Netherlands | 2022-10-01 | 2200.857 |
| 140271 | Netherlands | 2022-10-02 | 2200.857 |
| 140272 | Netherlands | 2022-10-03 | 2200.571 |
945 rows × 3 columns
# What unique values are in Airports column
at_df_timespan['Airports'].unique()
# Create 6 dataframes to work with
# Extract column: Commercial air traffic/Passengers/Total passengers/Total passengers (number)
at_df_total = at_df_timespan[at_df_timespan['Airports']==
'Total Dutch airports']
at_df_total = at_df_total[['Total Passengers','Periods', 'Airports']]
at_df_schiphol = at_df_timespan[at_df_timespan['Airports']==
'Amsterdam Airport Schiphol']
at_df_schiphol = at_df_schiphol[['Total Passengers', 'Periods', 'Airports']]
at_df_rotterdam = at_df_timespan[at_df_timespan['Airports']==
'Rotterdam The Hague Airport']
at_df_rotterdam = at_df_rotterdam[['Total Passengers', 'Periods', 'Airports']]
at_df_eindhoven = at_df_timespan[at_df_timespan['Airports']==
'Eindhoven Airport']
at_df_eindhoven = at_df_eindhoven[['Total Passengers', 'Periods', 'Airports']]
at_df_maastricht = at_df_timespan[at_df_timespan['Airports']==
'Maastricht Aachen Airport']
at_df_maastricht = at_df_maastricht[['Total Passengers', 'Periods', 'Airports']]
at_df_groningen = at_df_timespan[at_df_timespan['Airports']==
'Groningen Airport Eelde']
at_df_groningen = at_df_groningen[['Total Passengers', 'Periods', 'Airports']]
#Rename all passenger columns to shorter name
at_df_total = at_df_total.rename(columns=
{'Total Passengers':'Number of Passengers'})
at_df_schiphol = at_df_schiphol.rename(columns=
{'Total Passengers':'Number of Passengers'})
at_df_rotterdam = at_df_rotterdam.rename(columns=
{'Total Passengers':'Number of Passengers'})
at_df_eindhoven = at_df_eindhoven.rename(columns=
{'Total Passengers':'Number of Passengers'})
at_df_maastricht = at_df_maastricht.rename(columns=
{'Total Passengers':'Number of Passengers'})
at_df_groningen = at_df_groningen.rename(columns=
{'Total Passengers':'Number of Passengers'})
#CREATE BASE YEAR COLUMN
#Create list of 2018 number of passengers
total_base_year_2018 = at_df_total['Number of Passengers'].to_list()
total_base_year_2018 = total_base_year_2018[0:12]
total_base_year = []
schiphol_base_year_2018 = at_df_schiphol['Number of Passengers'].to_list()
schiphol_base_year_2018 = schiphol_base_year_2018[0:12]
schiphol_base_year = []
rotterdam_base_year_2018 = at_df_rotterdam['Number of Passengers'].to_list()
rotterdam_base_year_2018 = rotterdam_base_year_2018[0:12]
rotterdam_base_year = []
eindhoven_base_year_2018 = at_df_eindhoven['Number of Passengers'].to_list()
eindhoven_base_year_2018 = eindhoven_base_year_2018[0:12]
eindhoven_base_year = []
maastricht_base_year_2018 = at_df_maastricht['Number of Passengers'].to_list()
maastricht_base_year_2018 = maastricht_base_year_2018[0:12]
maastricht_base_year = []
groningen_base_year_2018 = at_df_groningen['Number of Passengers'].to_list()
groningen_base_year_2018 = groningen_base_year_2018[0:12]
groningen_base_year = []
#Create 5 times base year list
total_base_year = total_base_year_2018 * 5
schiphol_base_year = schiphol_base_year_2018 * 5
rotterdam_base_year = rotterdam_base_year_2018 * 5
eindhoven_base_year = eindhoven_base_year_2018 * 5
maastricht_base_year = maastricht_base_year_2018 * 5
groningen_base_year = groningen_base_year_2018 * 5
#Strip elements from base year
#Base year needs to have the same length as dataframe column
total_base_year = total_base_year[: len(at_df_total.index)]
schiphol_base_year = schiphol_base_year[: len(at_df_schiphol.index)]
rotterdam_base_year = rotterdam_base_year[: len(at_df_rotterdam.index)]
eindhoven_base_year = eindhoven_base_year[: len(at_df_eindhoven.index)]
maastricht_base_year = maastricht_base_year[: len(at_df_maastricht.index)]
groningen_base_year = groningen_base_year[: len(at_df_groningen.index)]
#Create column in dataframe with this base year
at_df_total['Previous number passengers (2018)'] = total_base_year
at_df_schiphol['Previous number passengers (2018)'] = schiphol_base_year
at_df_rotterdam['Previous number passengers (2018)'] = rotterdam_base_year
at_df_eindhoven['Previous number passengers (2018)'] = eindhoven_base_year
at_df_maastricht['Previous number passengers (2018)'] = maastricht_base_year
at_df_groningen['Previous number passengers (2018)'] = groningen_base_year
#Create percentage column
at_df_total['Percentage incline/decline'] = ((at_df_total['Number of Passengers'] -
at_df_total['Previous number passengers (2018)']) /
at_df_total['Previous number passengers (2018)']) * 100
at_df_schiphol['Percentage incline/decline'] = ((at_df_schiphol['Number of Passengers'] -
at_df_schiphol['Previous number passengers (2018)']) /
at_df_schiphol['Previous number passengers (2018)']) * 100
at_df_rotterdam['Percentage incline/decline'] = ((at_df_rotterdam['Number of Passengers'] -
at_df_rotterdam['Previous number passengers (2018)']) /
at_df_rotterdam['Previous number passengers (2018)']) * 100
at_df_eindhoven['Percentage incline/decline'] = ((at_df_eindhoven['Number of Passengers'] -
at_df_eindhoven['Previous number passengers (2018)']) /
at_df_eindhoven['Previous number passengers (2018)']) * 100
at_df_maastricht['Percentage incline/decline'] = ((at_df_maastricht['Number of Passengers'] -
at_df_maastricht['Previous number passengers (2018)']) /
at_df_maastricht['Previous number passengers (2018)']) * 100
at_df_groningen['Percentage incline/decline'] = ((at_df_groningen['Number of Passengers'] -
at_df_groningen['Previous number passengers (2018)']) /
at_df_groningen['Previous number passengers (2018)']) * 100
#Set index to periods to make plotting easier
at_df_total = at_df_total.set_index('Periods')
at_df_schiphol = at_df_schiphol.set_index('Periods')
at_df_rotterdam = at_df_rotterdam.set_index('Periods')
at_df_eindhoven = at_df_eindhoven.set_index('Periods')
at_df_maastricht = at_df_maastricht.set_index('Periods')
at_df_groningen = at_df_groningen.set_index('Periods')
#at_df_eindhoven.head(56)
at_df_rotterdam.head(48)
#Concat all 6 dataframes into 1 dataframe
at_df_complete = pd.concat([at_df_total, at_df_schiphol, at_df_rotterdam,
at_df_eindhoven, at_df_maastricht, at_df_groningen])
at_df_complete.head(36)
| Number of Passengers | Airports | Previous number passengers (2018) | Percentage incline/decline | |
|---|---|---|---|---|
| Periods | ||||
| 2018-01-01 | 5410899 | Total Dutch airports | 5410899 | 0.000000 |
| 2018-02-01 | 5237331 | Total Dutch airports | 5237331 | 0.000000 |
| 2018-03-01 | 6151187 | Total Dutch airports | 6151187 | 0.000000 |
| 2018-04-01 | 6730695 | Total Dutch airports | 6730695 | 0.000000 |
| 2018-05-01 | 7261667 | Total Dutch airports | 7261667 | 0.000000 |
| 2018-06-01 | 7233806 | Total Dutch airports | 7233806 | 0.000000 |
| 2018-07-01 | 7691695 | Total Dutch airports | 7691695 | 0.000000 |
| 2018-08-01 | 7786633 | Total Dutch airports | 7786633 | 0.000000 |
| 2018-09-01 | 7294410 | Total Dutch airports | 7294410 | 0.000000 |
| 2018-10-01 | 7262779 | Total Dutch airports | 7262779 | 0.000000 |
| 2018-11-01 | 5802548 | Total Dutch airports | 5802548 | 0.000000 |
| 2018-12-01 | 5742668 | Total Dutch airports | 5742668 | 0.000000 |
| 2019-01-01 | 5495052 | Total Dutch airports | 5410899 | 1.555250 |
| 2019-02-01 | 5352301 | Total Dutch airports | 5237331 | 2.195202 |
| 2019-03-01 | 6270788 | Total Dutch airports | 6151187 | 1.944356 |
| 2019-04-01 | 6926059 | Total Dutch airports | 6730695 | 2.902583 |
| 2019-05-01 | 7396960 | Total Dutch airports | 7261667 | 1.863112 |
| 2019-06-01 | 7471334 | Total Dutch airports | 7233806 | 3.283583 |
| 2019-07-01 | 7730263 | Total Dutch airports | 7691695 | 0.501424 |
| 2019-08-01 | 7859458 | Total Dutch airports | 7786633 | 0.935257 |
| 2019-09-01 | 7486440 | Total Dutch airports | 7294410 | 2.632564 |
| 2019-10-01 | 7354352 | Total Dutch airports | 7262779 | 1.260853 |
| 2019-11-01 | 5885771 | Total Dutch airports | 5802548 | 1.434249 |
| 2019-12-01 | 5938523 | Total Dutch airports | 5742668 | 3.410523 |
| 2020-01-01 | 5595249 | Total Dutch airports | 5410899 | 3.407012 |
| 2020-02-01 | 5281600 | Total Dutch airports | 5237331 | 0.845259 |
| 2020-03-01 | 2773554 | Total Dutch airports | 6151187 | -54.910264 |
| 2020-04-01 | 133752 | Total Dutch airports | 6730695 | -98.012806 |
| 2020-05-01 | 220120 | Total Dutch airports | 7261667 | -96.968740 |
| 2020-06-01 | 526544 | Total Dutch airports | 7233806 | -92.721066 |
| 2020-07-01 | 1690515 | Total Dutch airports | 7691695 | -78.021554 |
| 2020-08-01 | 2242935 | Total Dutch airports | 7786633 | -71.195060 |
| 2020-09-01 | 1547263 | Total Dutch airports | 7294410 | -78.788374 |
| 2020-10-01 | 1303123 | Total Dutch airports | 7262779 | -82.057515 |
| 2020-11-01 | 965071 | Total Dutch airports | 5802548 | -83.368151 |
| 2020-12-01 | 1306018 | Total Dutch airports | 5742668 | -77.257644 |
The graph below shows the relative differences of air traffic passengers between the various airports in The Netherlands. The year 2018 is used as base year, every month in the following years is compared to the respective month in 2018. As such, the percentage increase or decrease of the air traffic passengers due to COVID-19 can be visualized easily.
The hypothesis is that there will be only small differences in 2019 compared to 2018. From February or March 2020, there will be a big drop that will be equally felt by all airports, given the impactful measures at that time. In addition, it is expected that airports with a relatively high number of local flights will ultimately have the least impact, as they are less dependent on restrictions related to international travel. According to the database, Groningen Airport Eelde operates most local flights and therefore would be expected to be least affected by the restrictions overall.
# Figure is added with the relative incline/ decline of the airport
fig = px.line(at_df_complete, y='Percentage incline/decline',
color='Airports', title='Number of air traffic passengers', width=1000, height=800)
fig.show()
The year 2019 shows small growth for Amsterdam Airport Schiphol, Rotterdam The Hague Airport and Eindhoven Airport. In contrast, the differences in growth for the smaller airports Maastricht Aachen Airport and Groningen Airport Eelde is very apparent in 2019. According to Centraal Bureau voor de Statistiek, the large growth of Maastricht Aachen Airport be explained by the fact that it is a relatively small airport; a small change in the number of air passenger will have a relatively large effect (2019). The decline in the number of air passengers for Groningen Airport Eelde can be explained by the fact that its financial situation appeared to have deteriorated in recent years (Regionale luchthavens, n.d.).
From February 2020 onwards, there is indeed a steep decline in the amount of air traffic passengers, which applies to all airports. The lowest point of air passengers is reached in April 2020. From this point onwards, aviation began to slowly get back on track and passenger numbers rose until today. The graph shows that the total number of air passengers in the Netherlands is currently at 82% of pre-COVID levels. The number of passengers at Rotterdam The Hague Airport, Eindhoven Airport and Maastricht Aachen Airport are currently even above pre-COVID levels. However, against expectations, Groningen Airport Eelde has experienced the largest decrease in passenger numbers (currently at 47% of pre-COVID levels). It seems that financial setbacks have had more impact on this airport than the COVID-19 restrictions. Therefore, the hypothesis is rejected.
# The correct dataframe is created
# Extract only the total Dutch airports
# Extract the coloms needed (period, the number of passengers per continent)
q4_at_total = at_df_timespan[at_df_timespan['Airports'] == 'Total Dutch airports']
q4_at_total = q4_at_total[['Periods',
'Commercial air traffic/Passengers/Country of origin/destination/Europe/Europe total (number)',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/North America (number)',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/Central America (number)',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/South America (number)',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Asia/Asia (number)',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Oceania (number)',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Africa/Africa (number)']]
# Rename the colomns to shorter names
q4_at_total = q4_at_total.rename(columns={'Commercial air traffic/Passengers/Country of origin/destination/Europe/Europe total (number)': 'Europe',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/North America (number)' : 'North America',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/Central America (number)' : 'Central America',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/America/South America (number)' : 'South America',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Asia/Asia (number)': 'Asia',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Oceania (number)': 'Oceania',
'Commercial air traffic/Passengers/Country of origin/destination/Intercontinental/Africa/Africa (number)' : 'Africa'})
# In the dataset, the continent North America is split into North and Central
# Here it is combined into one column 'North Central America'
q4_at_total['NorthCentralAmerica'] = q4_at_total['North America'] + q4_at_total['Central America']
del q4_at_total['North America']
del q4_at_total['Central America']
# Base Year column is created per continent
# Required to see the relative change for the different airports over the time
# Europe
base_year_europe_2018 = q4_at_total['Europe'].to_list()
base_year_europe_2018 = base_year_europe_2018[0:12]
base_year_europe = []
base_year_europe = base_year_europe_2018 * 5
base_year_europe = base_year_europe[: len(q4_at_total.index)]
q4_at_total['Base year Europe (2018)'] = base_year_europe
q4_at_total['Percentage Europe'] = 100 + ((q4_at_total['Europe'] -
q4_at_total['Base year Europe (2018)']) /
q4_at_total['Base year Europe (2018)'] * 100)
# North Central America
base_year_ncamerica_2018 = q4_at_total['NorthCentralAmerica'].to_list()
base_year_ncamerica_2018 = base_year_ncamerica_2018[0:12]
base_year_ncamerica = []
base_year_ncamerica = base_year_ncamerica_2018 * 5
base_year_ncamerica = base_year_ncamerica[: len(q4_at_total.index)]
q4_at_total['Base year NorthCentralAmerica (2018)'] = base_year_ncamerica
q4_at_total['Percentage NorthCentralAmerica'] = 100 + ((q4_at_total['NorthCentralAmerica'] -
q4_at_total['Base year NorthCentralAmerica (2018)']) /
q4_at_total['Base year NorthCentralAmerica (2018)'] * 100)
# South America
base_year_southamerica_2018 = q4_at_total['South America'].to_list()
base_year_southamerica_2018 = base_year_southamerica_2018[0:12]
base_year_southamerica = []
base_year_southamerica = base_year_southamerica_2018 * 5
base_year_southamerica = base_year_southamerica[: len(q4_at_total.index)]
q4_at_total['Base year South America (2018)'] = base_year_southamerica
q4_at_total['Percentage South America'] = 100 + ((q4_at_total['South America'] -
q4_at_total['Base year South America (2018)']) /
q4_at_total['Base year South America (2018)'] * 100)
# Asia
base_year_asia_2018 = q4_at_total['Asia'].to_list()
base_year_asia_2018 = base_year_asia_2018[0:12]
base_year_asia = []
base_year_asia = base_year_asia_2018 * 5
base_year_asia = base_year_asia[: len(q4_at_total.index)]
q4_at_total['Base year Asia (2018)'] = base_year_asia
q4_at_total['Percentage Asia'] = 100 + ((q4_at_total['Asia'] -
q4_at_total['Base year Asia (2018)']) /
q4_at_total['Base year Asia (2018)'] * 100)
# Oceania
base_year_oceania_2018 = q4_at_total['Oceania'].to_list()
base_year_oceania_2018 = base_year_oceania_2018[0:12]
base_year_oceania = []
base_year_oceania = base_year_oceania_2018 * 5
base_year_oceania = base_year_oceania[: len(q4_at_total.index)]
q4_at_total['Base year Oceania (2018)'] = base_year_oceania
q4_at_total['Percentage Oceania'] = 100 + ((q4_at_total['Oceania'] -
q4_at_total['Base year Oceania (2018)']) /
q4_at_total['Base year Oceania (2018)'] * 100)
# Africa
base_year_africa_2018 = q4_at_total['Africa'].to_list()
base_year_africa_2018 = base_year_africa_2018[0:12]
base_year_africa = []
base_year_africa = base_year_africa_2018 * 5
base_year_africa = base_year_africa[: len(q4_at_total.index)]
q4_at_total['Base year Africa (2018)'] = base_year_africa
q4_at_total['Percentage Africa'] = 100 + ((q4_at_total['Africa'] -
q4_at_total['Base year Africa (2018)']) /
q4_at_total['Base year Africa (2018)'] * 100)
q4_at_total.head()
| Periods | Europe | South America | Asia | Oceania | Africa | NorthCentralAmerica | Base year Europe (2018) | Percentage Europe | Base year NorthCentralAmerica (2018) | Percentage NorthCentralAmerica | Base year South America (2018) | Percentage South America | Base year Asia (2018) | Percentage Asia | Base year Oceania (2018) | Percentage Oceania | Base year Africa (2018) | Percentage Africa | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 235 | 2018-01-01 | 3805859 | 134923 | 599996 | 0 | 270955 | 599165 | 3805859 | 100.0 | 599165 | 100.0 | 134923 | 100.0 | 599996 | 100.0 | 0 | NaN | 270955 | 100.0 |
| 236 | 2018-02-01 | 3793051 | 121471 | 558192 | 0 | 244383 | 520231 | 3793051 | 100.0 | 520231 | 100.0 | 121471 | 100.0 | 558192 | 100.0 | 0 | NaN | 244383 | 100.0 |
| 237 | 2018-03-01 | 4455464 | 132398 | 623321 | 0 | 276990 | 663012 | 4455464 | 100.0 | 663012 | 100.0 | 132398 | 100.0 | 623321 | 100.0 | 0 | NaN | 276990 | 100.0 |
| 238 | 2018-04-01 | 4932741 | 131039 | 631721 | 0 | 262484 | 772701 | 4932741 | 100.0 | 772701 | 100.0 | 131039 | 100.0 | 631721 | 100.0 | 0 | NaN | 262484 | 100.0 |
| 239 | 2018-05-01 | 5456899 | 134519 | 600868 | 0 | 241021 | 828355 | 5456899 | 100.0 | 828355 | 100.0 | 134519 | 100.0 | 600868 | 100.0 | 0 | NaN | 241021 | 100.0 |
# Dataframe consisting of period and percentage per continent
q4_at_percentage = q4_at_total[['Periods', 'Percentage Europe',
'Percentage NorthCentralAmerica', 'Percentage South America',
'Percentage Asia', 'Percentage Oceania', 'Percentage Africa']]
q4_at_percentage = q4_at_percentage.set_index('Periods')
q4_at_percentage.head(60)
| Percentage Europe | Percentage NorthCentralAmerica | Percentage South America | Percentage Asia | Percentage Oceania | Percentage Africa | |
|---|---|---|---|---|---|---|
| Periods | ||||||
| 2018-01-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-02-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-03-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-04-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-05-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-06-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-07-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-08-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-09-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-10-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-11-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2018-12-01 | 100.000000 | 100.000000 | 100.000000 | 100.000000 | NaN | 100.000000 |
| 2019-01-01 | 100.896749 | 104.442182 | 107.797781 | 100.632504 | NaN | 103.355908 |
| 2019-02-01 | 101.923939 | 105.128299 | 108.203604 | 99.444456 | NaN | 103.458097 |
| 2019-03-01 | 102.060324 | 105.077736 | 105.166996 | 97.655141 | NaN | 100.691361 |
| 2019-04-01 | 103.277569 | 103.775199 | 102.667908 | 98.592575 | NaN | 103.780040 |
| 2019-05-01 | 102.165241 | 104.490104 | 98.086516 | 97.952795 | NaN | 97.851225 |
| 2019-06-01 | 103.682643 | 104.683262 | 97.322592 | 97.264756 | NaN | 108.043648 |
| 2019-07-01 | 100.451098 | 104.014547 | 98.161834 | 96.548693 | NaN | 101.189021 |
| 2019-08-01 | 101.106922 | 104.275644 | 98.060752 | 95.689600 | NaN | 101.235414 |
| 2019-09-01 | 103.099924 | 104.915006 | 91.700944 | 97.566742 | NaN | 103.767755 |
| 2019-10-01 | 101.723139 | 102.772130 | 99.948387 | 96.306591 | NaN | 100.076300 |
| 2019-11-01 | 101.506241 | 102.628134 | 106.515429 | 99.129834 | NaN | 100.023184 |
| 2019-12-01 | 104.131710 | 105.256274 | 102.704056 | 98.218290 | NaN | 100.110622 |
| 2020-01-01 | 103.355064 | 107.094540 | 108.255079 | 98.869826 | NaN | 103.615730 |
| 2020-02-01 | 101.513030 | 111.170615 | 110.189263 | 80.724195 | NaN | 109.815740 |
| 2020-03-01 | 43.005891 | 52.669484 | 66.183779 | 40.697811 | NaN | 60.264992 |
| 2020-04-01 | 1.529008 | 3.245369 | 3.832447 | 3.933857 | inf | 1.095305 |
| 2020-05-01 | 2.635911 | 3.995992 | 6.656309 | 5.073494 | NaN | 1.552147 |
| 2020-06-01 | 7.307845 | 7.148388 | 10.022312 | 8.263153 | NaN | 3.098927 |
| 2020-07-01 | 25.768998 | 12.392835 | 9.915672 | 11.563843 | NaN | 7.480316 |
| 2020-08-01 | 34.825130 | 14.217797 | 13.200855 | 10.758444 | NaN | 7.776577 |
| 2020-09-01 | 24.152286 | 13.393904 | 15.540217 | 11.559010 | NaN | 11.381908 |
| 2020-10-01 | 19.143115 | 15.240423 | 17.298332 | 11.913931 | NaN | 16.753678 |
| 2020-11-01 | 16.562731 | 20.258550 | 18.744992 | 12.303270 | NaN | 17.488583 |
| 2020-12-01 | 22.374328 | 26.747942 | 33.070439 | 14.921390 | NaN | 30.086732 |
| 2021-01-01 | 15.520149 | 23.393055 | 25.422648 | 12.892086 | NaN | 24.773855 |
| 2021-02-01 | 8.939057 | 14.780165 | 9.426941 | 9.538653 | NaN | 16.030984 |
| 2021-03-01 | 10.042186 | 15.412089 | 16.256288 | 11.050486 | NaN | 13.225748 |
| 2021-04-01 | 11.501739 | 13.188284 | 20.136753 | 12.575488 | NaN | 16.301565 |
| 2021-05-01 | 15.897417 | 17.476444 | 18.044291 | 13.874595 | NaN | 20.644674 |
| 2021-06-01 | 26.257463 | 27.199186 | 27.253261 | 16.234826 | NaN | 35.834532 |
| 2021-07-01 | 48.472744 | 44.263632 | 34.684209 | 21.502785 | NaN | 57.639113 |
| 2021-08-01 | 62.678401 | 50.769772 | 45.090252 | 24.191271 | NaN | 62.638144 |
| 2021-09-01 | 60.760257 | 43.760590 | 51.848148 | 22.192036 | NaN | 52.042653 |
| 2021-10-01 | 67.053123 | 47.652080 | 66.434168 | 27.040859 | NaN | 46.136027 |
| 2021-11-01 | 63.965211 | 65.633450 | 75.655776 | 31.878678 | NaN | 43.105434 |
| 2021-12-01 | 56.322608 | 72.612619 | 72.819646 | 35.577985 | NaN | 44.281694 |
| 2022-01-01 | 52.766747 | 69.668455 | 77.618345 | 29.606364 | NaN | 45.608680 |
| 2022-02-01 | 60.107470 | 67.805648 | 84.519762 | 32.262913 | NaN | 51.060426 |
| 2022-03-01 | 71.896193 | 77.255012 | 91.193976 | 38.800554 | NaN | 59.045814 |
| 2022-04-01 | 79.967953 | 82.509276 | 98.542419 | 40.467706 | NaN | 66.192987 |
| 2022-05-01 | 86.877914 | 88.332901 | 96.784097 | 49.148565 | NaN | 80.487177 |
| 2022-06-01 | 86.649167 | 94.937623 | 92.929875 | 49.447696 | NaN | 86.806954 |
| 2022-07-01 | 80.808859 | 97.755632 | 91.473781 | 53.120166 | NaN | 87.009950 |
| 2022-08-01 | 82.783463 | 94.796890 | 93.272207 | 52.865359 | NaN | 88.703089 |
In these graphs the relative changes in the number of passengers per continent is displayed by means of percentages. Furthermore, a map is shown in which the percentual changes over time can be seen. The hypothesis for this sub question is that the number of air passengers on intercontinental flights has been more affected than the number of passengers on European flights.
Due to lack of available data oceania was left out of scope.
# Plot figure with relative change for the different continents over the time
# Base year is 2018
fig = px.line(q4_at_percentage, y = ['Percentage Europe',
'Percentage NorthCentralAmerica', 'Percentage South America',
'Percentage Asia', 'Percentage Africa'])
fig.update_layout(title='Number of air traffic passengers per continent',
xaxis_title= 'Date', yaxis_title = 'index base (2018=100)')
fig.show()
# Import gapminder data set
# Make list of all countries, relevant continent and iso_alpha code
df_map = px.data.gapminder()
df_map_country_continent = df_map.iloc[:, [0,1,6]]
df_map_2 = df_map_country_continent.drop_duplicates()
# For each country create correct number of rows (total number of periods)
df_map_3 = df_map_2.append([df_map_2] * (len(q4_at_percentage.index) - 1))
df_map_3 = df_map_3.sort_values('country', ascending=True)
# Add column with periods to dataframe of countries
periode = q4_at_percentage.index.to_list()
periodes = periode * 142
df_map_3['Periods'] = periodes
# For each continent subsequently a dataframe and list is created
# This contains all the periods for all the countries in the continent
# For every continent a column is added with the change in passengers
# Asia
df_map_asia = df_map_3[df_map_3['continent'] == 'Asia']
number_asia = df_map_asia['country'].nunique()
percentage_asia_list = q4_at_percentage['Percentage Asia'].to_list()
percentage_asia_list_all = []
percentage_asia_list_all = percentage_asia_list * number_asia
df_map_asia['percentage'] = percentage_asia_list_all
# Europe
df_map_europe = df_map_3[df_map_3['continent'] == 'Europe']
number_europe = df_map_europe['country'].nunique()
percentage_europe_list = q4_at_percentage['Percentage Europe'].to_list()
percentage_europe_list_all = []
percentage_europe_list_all = percentage_europe_list * number_europe
df_map_europe['percentage'] = percentage_europe_list_all
# Africa
df_map_africa = df_map_3[df_map_3['continent'] == 'Africa']
number_africa = df_map_africa['country'].nunique()
percentage_africa_list = q4_at_percentage['Percentage Africa'].to_list()
percentage_africa_list_all = []
percentage_africa_list_all = percentage_africa_list * number_africa
df_map_africa['percentage'] = percentage_africa_list_all
# Oceania
df_map_oceania = df_map_3[df_map_3['continent'] == 'Oceania']
number_oceania = df_map_oceania['country'].nunique()
percentage_oceania_list = q4_at_percentage['Percentage Oceania'].to_list()
percentage_oceania_list_all = []
percentage_oceania_list_all = percentage_oceania_list * number_oceania
df_map_oceania['percentage'] = percentage_oceania_list_all
# North Central America
# Dataframe created by excluding South American countries from 'Americas'
df_map_northcentralamerica = df_map_3[df_map_3['continent'] == 'Americas']
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Argentina'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Bolivia'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Brazil'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Chile'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Colombia'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Ecuador'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Paraguay'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Peru'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Uruguay'
]
df_map_northcentralamerica = df_map_northcentralamerica[
df_map_northcentralamerica.country != 'Venezuela'
]
df_map_northcentralamerica['continent'] = 'North Central America'
df_map_northcentralamerica['country'].unique()
number_northcentralamerica = df_map_northcentralamerica[
'country'].nunique()
percentage_northcentralamerica_list = q4_at_percentage[
'Percentage NorthCentralAmerica'].to_list()
percentage_northcentralamerica_list_all = []
percentage_northcentralamerica_list_all = percentage_northcentralamerica_list * \
number_northcentralamerica
df_map_northcentralamerica['percentage'] = \
percentage_northcentralamerica_list_all
# South America
# Dataframe created by excluding North/Central Am. countries from 'Americas'
df_map_southamerica = df_map_3[df_map_3['continent'] == 'Americas']
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Canada'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Costa Rica'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Cuba'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Dominican Republic'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'El Salvador'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Guetemala'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Haiti'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Honduras'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Jamaica'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Mexico'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Nicaragua'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Panama'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Puerto Rico'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'Trinidad and Tobago'
]
df_map_southamerica = df_map_southamerica[
df_map_southamerica.country != 'United States'
]
df_map_southamerica['continent'] = 'South America'
df_map_southamerica['country'].unique()
number_southamerica = df_map_southamerica['country'].nunique()
percentage_southamerica_list = q4_at_percentage[
'Percentage South America'].to_list()
percentage_southamerica_list_all = []
percentage_southamerica_list_all = percentage_southamerica_list * \
number_southamerica
df_map_southamerica['percentage'] = percentage_southamerica_list_all
# Link together dataframe of the various continents
# Convert period into string data type
map_complete = pd.concat([df_map_asia, df_map_europe, df_map_africa,
df_map_northcentralamerica, df_map_southamerica])
map_complete['Periods'] = map_complete['Periods'].dt.strftime('%Y-%m-%d')
# Plot chlorpeth map with countries grouped into the continents
# Slider for the periods and color range indicating the number of air passengers
fig = px.choropleth(map_complete, locations='iso_alpha', color='percentage',
hover_name='continent', animation_frame="Periods", range_color=[0,110],
projection='natural earth', color_continuous_scale='rdylbu')
fig.show()
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:9: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead. C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:31: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:42: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:53: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2872862013.py:64: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
When looking at the graph and the map, the following is concluded: First, in February 2020 a large drop in the number of passengers occured for all continents. Around summer (May 2020) these numbers of passengers increase again. Especially for flights to Europe, the number of passengers was at 35% of pre-COVID levels. This can be explained by the fact that flights to European countries were partly allowed again during this period.
In August 2020, there is again a decline in the number of passengers for European fligths, continuing until circa February 2021. This decline can be explained by the call for only necessary travel. On the other hand, for the other continents (except for Asia), there is a small peak in the number of passengers around November 2020. This could be explained by the fact that it was possible to travel with a negative test result. Around April 2021, when traveling to many countries was possible again, the number of passengers started increasing for all continents. After this, there were smaller drops, for example, air traffic from/to Africa significantly declined between August-November 2021. This can be explained by the Omicron variant due to which a lot of regulations were set. Moreover, air traffic passengers within Europe declined in October 2021 and January 2022, but these drops were not as great as in February 2020. Around July 2022, the numbers of air traffic passengers are comparable to pre-COVID levels. Except for Asia, the number of passengers from/to Asia are still low (53% of pre-COVId levels), which can be explained by the fact that COVID-19 was still very active in Asia around this time.
The hypothesis is partly confirmed. During some periods, the number of air passengers within Europe was less affected than international air passengers. However, there were also periods in which international travel was less affected than European travel. This is mostly remarkable in January 2022 for North, Middle, South America. This can be explained by the fact that there were regular bans on flight to specific parts of the world as well as within Europe (as can be read in the regulations overview). Possibly, consumer preference also played a role (e.g. increased preference for international travel after COVID-19). It is also notable that, at the moment, Europe is further down pre-COVID levels than Africa and South/Middle America, therefore the hypothesis is partly rejected as well.
The first idea can be to run a correlation, this is done for two cases. The first case takes into account all 0-value covid cases before March 2020. The second correlation only takes into account the data for which there are covid cases (from March 2020 onwards).
For the first correlation it can be seen that there is a negative correlation coefficient between -0.15 and -0.30. This shows that when covid cases are low, there are more flights.
In the second case, the correlations are not really apparant. This can be explained by the fact that there is missing information in our dataframe to simply use a correlation to verify the relationship between new covid cases and number of passengers. For example, March and April 2020 had relatively few covid cases, because the test capacity was very low. However, there were not many flights. Also, the past months show that there are a lot of new covid cases, while there are simultaneaously a lot of air passengers. This can be due to the fact that there is more testing capacity and/or the variant is more mild.
In conclusion, a correlation was one of the first analysis methods that came to mind in order to answer our research question. However, simply looking at the correlation coefficients is not suffient to answer our research question. The reason is explained above. Therefore, we based our answer to the research question mainly on the figures.
A correlation could have been a good method when there would be certain weights for certain months. For example, number of new cases is multiplied with a 'larger'weight when there is a more severe covid variant. However, how to apply these weight would require extensive statistical knowledge and this fall outside the scope of this course.
covid_nl_clean_df.head()
at_df_timespan.head()
at_df_timespan_corr = at_df_timespan[['Periods', 'Airports', 'Total Passengers' ]]
at_df_timespan_corr.head(120)
| Periods | Airports | Total Passengers | |
|---|---|---|---|
| 235 | 2018-01-01 | Total Dutch airports | 5410899 |
| 236 | 2018-02-01 | Total Dutch airports | 5237331 |
| 237 | 2018-03-01 | Total Dutch airports | 6151187 |
| 238 | 2018-04-01 | Total Dutch airports | 6730695 |
| 239 | 2018-05-01 | Total Dutch airports | 7261667 |
| ... | ... | ... | ... |
| 828 | 2018-04-01 | Rotterdam The Hague Airport | 144208 |
| 829 | 2018-05-01 | Rotterdam The Hague Airport | 221150 |
| 830 | 2018-06-01 | Rotterdam The Hague Airport | 217739 |
| 831 | 2018-07-01 | Rotterdam The Hague Airport | 230635 |
| 832 | 2018-08-01 | Rotterdam The Hague Airport | 232799 |
120 rows × 3 columns
# Include months with zero Covid cases
# Create year and month columns and groupby
df_cases = covid_nl_clean_df.copy()
df_cases['year'] = pd.DatetimeIndex(df_cases['date']).year
df_cases['month'] = pd.DatetimeIndex(df_cases['date']).month
df_cases = df_cases.groupby(by=['year', 'month']).agg({'new_cases_smoothed':
'sum'})
# Delete 2022-09 & 2022-10, since no airport-data available for these months
# Remove multi-index from groupby
df_cases = df_cases.iloc[:-2]
df_test = df_cases.reset_index()
# Loop through airports to get correlation
# Correlation of #cases/month in NL with #passenger/month at certain airport
for i in at_df_timespan_corr['Airports'].unique().tolist():
# Take only airport of interest
df_temp = at_df_timespan_corr[at_df_timespan_corr['Airports']==i]
# Create year and month variable
df_temp['year'] = pd.DatetimeIndex(df_temp['Periods']).year
df_temp['month'] = pd.DatetimeIndex(df_temp['Periods']).month
# Merge 'new cases' and 'flights per airport' on year and month
df_temp = df_temp.reset_index(drop=True)
df_concat = df_temp.merge(df_test, on=['year', 'month'], how='outer')
# Rename columns for convenience
df_concat.columns = ['Periods', 'Airports', 'Total passengers', 'year',
'month', 'New Cases']
# Fill 'New cases column' with 0 cases, if NaN (so before '2022-03')
df_concat['New Cases'] = df_concat['New Cases'].fillna(0)
# If you want to print your data (Uncomment this for second case)
print(df_concat[['New Cases', 'Periods', 'Airports', 'Total passengers']])
print('Correlation at', i, 'is: ')
print(df_concat[['New Cases', 'Total passengers']].corr())
print(' ')
New Cases Periods Airports Total passengers
0 0.000 2018-01-01 Total Dutch airports 5410899
1 0.000 2018-02-01 Total Dutch airports 5237331
2 0.000 2018-03-01 Total Dutch airports 6151187
3 0.000 2018-04-01 Total Dutch airports 6730695
4 0.000 2018-05-01 Total Dutch airports 7261667
5 0.000 2018-06-01 Total Dutch airports 7233806
6 0.000 2018-07-01 Total Dutch airports 7691695
7 0.000 2018-08-01 Total Dutch airports 7786633
8 0.000 2018-09-01 Total Dutch airports 7294410
9 0.000 2018-10-01 Total Dutch airports 7262779
10 0.000 2018-11-01 Total Dutch airports 5802548
11 0.000 2018-12-01 Total Dutch airports 5742668
12 0.000 2019-01-01 Total Dutch airports 5495052
13 0.000 2019-02-01 Total Dutch airports 5352301
14 0.000 2019-03-01 Total Dutch airports 6270788
15 0.000 2019-04-01 Total Dutch airports 6926059
16 0.000 2019-05-01 Total Dutch airports 7396960
17 0.000 2019-06-01 Total Dutch airports 7471334
18 0.000 2019-07-01 Total Dutch airports 7730263
19 0.000 2019-08-01 Total Dutch airports 7859458
20 0.000 2019-09-01 Total Dutch airports 7486440
21 0.000 2019-10-01 Total Dutch airports 7354352
22 0.000 2019-11-01 Total Dutch airports 5885771
23 0.000 2019-12-01 Total Dutch airports 5938523
24 0.000 2020-01-01 Total Dutch airports 5595249
25 0.000 2020-02-01 Total Dutch airports 5281600
26 10656.001 2020-03-01 Total Dutch airports 2773554
27 27924.714 2020-04-01 Total Dutch airports 133752
28 7582.998 2020-05-01 Total Dutch airports 220120
29 4043.568 2020-06-01 Total Dutch airports 526544
30 3634.429 2020-07-01 Total Dutch airports 1690515
31 16229.146 2020-08-01 Total Dutch airports 2242935
32 45306.571 2020-09-01 Total Dutch airports 1547263
33 216295.287 2020-10-01 Total Dutch airports 1303123
34 182778.574 2020-11-01 Total Dutch airports 965071
35 266188.860 2020-12-01 Total Dutch airports 1306018
36 191199.141 2021-01-01 Total Dutch airports 909617
37 109028.142 2021-02-01 Total Dutch airports 519827
38 179947.141 2021-03-01 Total Dutch airports 676647
39 222759.287 2021-04-01 Total Dutch airports 817876
40 162576.713 2021-05-01 Total Dutch airports 1169673
41 40344.716 2021-06-01 Total Dutch airports 1870330
42 174610.284 2021-07-01 Total Dutch airports 3515159
43 78988.999 2021-08-01 Total Dutch airports 4479180
44 63854.573 2021-09-01 Total Dutch airports 4013477
45 116907.427 2021-10-01 Total Dutch airports 4395945
46 482635.572 2021-11-01 Total Dutch airports 3492940
47 505056.000 2021-12-01 Total Dutch airports 3208864
48 1177889.571 2022-01-01 Total Dutch airports 2831598
49 1987987.427 2022-02-01 Total Dutch airports 3040193
50 1514981.857 2022-03-01 Total Dutch airports 4241663
51 264584.427 2022-04-01 Total Dutch airports 5140680
52 39185.430 2022-05-01 Total Dutch airports 6092054
53 82594.432 2022-06-01 Total Dutch airports 6118527
54 160921.573 2022-07-01 Total Dutch airports 6211931
55 56599.998 2022-08-01 Total Dutch airports 6378969
Correlation at Total Dutch airports is:
New Cases Total passengers
New Cases 1.000000 -0.237632
Total passengers -0.237632 1.000000
New Cases Periods Airports Total passengers
0 0.000 2018-01-01 Amsterdam Airport Schiphol 4908989
1 0.000 2018-02-01 Amsterdam Airport Schiphol 4741806
2 0.000 2018-03-01 Amsterdam Airport Schiphol 5559456
3 0.000 2018-04-01 Amsterdam Airport Schiphol 6016915
4 0.000 2018-05-01 Amsterdam Airport Schiphol 6393936
5 0.000 2018-06-01 Amsterdam Airport Schiphol 6377393
6 0.000 2018-07-01 Amsterdam Airport Schiphol 6765004
7 0.000 2018-08-01 Amsterdam Airport Schiphol 6836668
8 0.000 2018-09-01 Amsterdam Airport Schiphol 6396940
9 0.000 2018-10-01 Amsterdam Airport Schiphol 6402290
10 0.000 2018-11-01 Amsterdam Airport Schiphol 5296943
11 0.000 2018-12-01 Amsterdam Airport Schiphol 5260254
12 0.000 2019-01-01 Amsterdam Airport Schiphol 4996131
13 0.000 2019-02-01 Amsterdam Airport Schiphol 4836332
14 0.000 2019-03-01 Amsterdam Airport Schiphol 5630314
15 0.000 2019-04-01 Amsterdam Airport Schiphol 6104010
16 0.000 2019-05-01 Amsterdam Airport Schiphol 6441473
17 0.000 2019-06-01 Amsterdam Airport Schiphol 6502588
18 0.000 2019-07-01 Amsterdam Airport Schiphol 6724023
19 0.000 2019-08-01 Amsterdam Airport Schiphol 6810759
20 0.000 2019-09-01 Amsterdam Airport Schiphol 6493468
21 0.000 2019-10-01 Amsterdam Airport Schiphol 6431122
22 0.000 2019-11-01 Amsterdam Airport Schiphol 5323306
23 0.000 2019-12-01 Amsterdam Airport Schiphol 5386203
24 0.000 2020-01-01 Amsterdam Airport Schiphol 5074773
25 0.000 2020-02-01 Amsterdam Airport Schiphol 4719769
26 10656.001 2020-03-01 Amsterdam Airport Schiphol 2476372
27 27924.714 2020-04-01 Amsterdam Airport Schiphol 126015
28 7582.998 2020-05-01 Amsterdam Airport Schiphol 207827
29 4043.568 2020-06-01 Amsterdam Airport Schiphol 471410
30 3634.429 2020-07-01 Amsterdam Airport Schiphol 1338857
31 16229.146 2020-08-01 Amsterdam Airport Schiphol 1854786
32 45306.571 2020-09-01 Amsterdam Airport Schiphol 1337741
33 216295.287 2020-10-01 Amsterdam Airport Schiphol 1143483
34 182778.574 2020-11-01 Amsterdam Airport Schiphol 900434
35 266188.860 2020-12-01 Amsterdam Airport Schiphol 1233043
36 191199.141 2021-01-01 Amsterdam Airport Schiphol 869129
37 109028.142 2021-02-01 Amsterdam Airport Schiphol 505194
38 179947.141 2021-03-01 Amsterdam Airport Schiphol 660176
39 222759.287 2021-04-01 Amsterdam Airport Schiphol 786652
40 162576.713 2021-05-01 Amsterdam Airport Schiphol 1106740
41 40344.716 2021-06-01 Amsterdam Airport Schiphol 1678265
42 174610.284 2021-07-01 Amsterdam Airport Schiphol 3029951
43 78988.999 2021-08-01 Amsterdam Airport Schiphol 3786973
44 63854.573 2021-09-01 Amsterdam Airport Schiphol 3370205
45 116907.427 2021-10-01 Amsterdam Airport Schiphol 3745991
46 482635.572 2021-11-01 Amsterdam Airport Schiphol 3095823
47 505056.000 2021-12-01 Amsterdam Airport Schiphol 2855711
48 1177889.571 2022-01-01 Amsterdam Airport Schiphol 2488083
49 1987987.427 2022-02-01 Amsterdam Airport Schiphol 2660676
50 1514981.857 2022-03-01 Amsterdam Airport Schiphol 3732048
51 264584.427 2022-04-01 Amsterdam Airport Schiphol 4434587
52 39185.430 2022-05-01 Amsterdam Airport Schiphol 5217035
53 82594.432 2022-06-01 Amsterdam Airport Schiphol 5232630
54 160921.573 2022-07-01 Amsterdam Airport Schiphol 5179725
55 56599.998 2022-08-01 Amsterdam Airport Schiphol 5327361
Correlation at Amsterdam Airport Schiphol is:
New Cases Total passengers
New Cases 1.000000 -0.241102
Total passengers -0.241102 1.000000
New Cases Periods Airports Total passengers
0 0.000 2018-01-01 Rotterdam The Hague Airport 89021
1 0.000 2018-02-01 Rotterdam The Hague Airport 88493
2 0.000 2018-03-01 Rotterdam The Hague Airport 121533
3 0.000 2018-04-01 Rotterdam The Hague Airport 144208
4 0.000 2018-05-01 Rotterdam The Hague Airport 221150
5 0.000 2018-06-01 Rotterdam The Hague Airport 217739
6 0.000 2018-07-01 Rotterdam The Hague Airport 230635
7 0.000 2018-08-01 Rotterdam The Hague Airport 232799
8 0.000 2018-09-01 Rotterdam The Hague Airport 223027
9 0.000 2018-10-01 Rotterdam The Hague Airport 193930
10 0.000 2018-11-01 Rotterdam The Hague Airport 73245
11 0.000 2018-12-01 Rotterdam The Hague Airport 72378
12 0.000 2019-01-01 Rotterdam The Hague Airport 84056
13 0.000 2019-02-01 Rotterdam The Hague Airport 95420
14 0.000 2019-03-01 Rotterdam The Hague Airport 137683
15 0.000 2019-04-01 Rotterdam The Hague Airport 169142
16 0.000 2019-05-01 Rotterdam The Hague Airport 227437
17 0.000 2019-06-01 Rotterdam The Hague Airport 240069
18 0.000 2019-07-01 Rotterdam The Hague Airport 251074
19 0.000 2019-08-01 Rotterdam The Hague Airport 269858
20 0.000 2019-09-01 Rotterdam The Hague Airport 240606
21 0.000 2019-10-01 Rotterdam The Hague Airport 198592
22 0.000 2019-11-01 Rotterdam The Hague Airport 91748
23 0.000 2019-12-01 Rotterdam The Hague Airport 89113
24 0.000 2020-01-01 Rotterdam The Hague Airport 99080
25 0.000 2020-02-01 Rotterdam The Hague Airport 104062
26 10656.001 2020-03-01 Rotterdam The Hague Airport 62870
27 27924.714 2020-04-01 Rotterdam The Hague Airport 0
28 7582.998 2020-05-01 Rotterdam The Hague Airport 134
29 4043.568 2020-06-01 Rotterdam The Hague Airport 7971
30 3634.429 2020-07-01 Rotterdam The Hague Airport 78468
31 16229.146 2020-08-01 Rotterdam The Hague Airport 74047
32 45306.571 2020-09-01 Rotterdam The Hague Airport 32047
33 216295.287 2020-10-01 Rotterdam The Hague Airport 21811
34 182778.574 2020-11-01 Rotterdam The Hague Airport 4761
35 266188.860 2020-12-01 Rotterdam The Hague Airport 4590
36 191199.141 2021-01-01 Rotterdam The Hague Airport 3311
37 109028.142 2021-02-01 Rotterdam The Hague Airport 2871
38 179947.141 2021-03-01 Rotterdam The Hague Airport 98
39 222759.287 2021-04-01 Rotterdam The Hague Airport 1945
40 162576.713 2021-05-01 Rotterdam The Hague Airport 8912
41 40344.716 2021-06-01 Rotterdam The Hague Airport 39309
42 174610.284 2021-07-01 Rotterdam The Hague Airport 113882
43 78988.999 2021-08-01 Rotterdam The Hague Airport 181957
44 63854.573 2021-09-01 Rotterdam The Hague Airport 167169
45 116907.427 2021-10-01 Rotterdam The Hague Airport 147368
46 482635.572 2021-11-01 Rotterdam The Hague Airport 48278
47 505056.000 2021-12-01 Rotterdam The Hague Airport 40295
48 1177889.571 2022-01-01 Rotterdam The Hague Airport 58903
49 1987987.427 2022-02-01 Rotterdam The Hague Airport 63510
50 1514981.857 2022-03-01 Rotterdam The Hague Airport 101163
51 264584.427 2022-04-01 Rotterdam The Hague Airport 139308
52 39185.430 2022-05-01 Rotterdam The Hague Airport 224714
53 82594.432 2022-06-01 Rotterdam The Hague Airport 224069
54 160921.573 2022-07-01 Rotterdam The Hague Airport 312468
55 56599.998 2022-08-01 Rotterdam The Hague Airport 305371
Correlation at Rotterdam The Hague Airport is:
New Cases Total passengers
New Cases 1.000000 -0.220506
Total passengers -0.220506 1.000000
New Cases Periods Airports Total passengers
0 0.000 2018-01-01 Eindhoven Airport 398089
1 0.000 2018-02-01 Eindhoven Airport 393080
2 0.000 2018-03-01 Eindhoven Airport 452090
3 0.000 2018-04-01 Eindhoven Airport 537248
4 0.000 2018-05-01 Eindhoven Airport 585787
5 0.000 2018-06-01 Eindhoven Airport 583746
6 0.000 2018-07-01 Eindhoven Airport 623708
7 0.000 2018-08-01 Eindhoven Airport 635624
8 0.000 2018-09-01 Eindhoven Airport 615201
9 0.000 2018-10-01 Eindhoven Airport 612905
10 0.000 2018-11-01 Eindhoven Airport 409628
11 0.000 2018-12-01 Eindhoven Airport 390649
12 0.000 2019-01-01 Eindhoven Airport 400481
13 0.000 2019-02-01 Eindhoven Airport 404961
14 0.000 2019-03-01 Eindhoven Airport 486336
15 0.000 2019-04-01 Eindhoven Airport 606490
16 0.000 2019-05-01 Eindhoven Airport 656099
17 0.000 2019-06-01 Eindhoven Airport 657648
18 0.000 2019-07-01 Eindhoven Airport 665638
19 0.000 2019-08-01 Eindhoven Airport 681093
20 0.000 2019-09-01 Eindhoven Airport 672355
21 0.000 2019-10-01 Eindhoven Airport 662238
22 0.000 2019-11-01 Eindhoven Airport 446930
23 0.000 2019-12-01 Eindhoven Airport 440506
24 0.000 2020-01-01 Eindhoven Airport 400991
25 0.000 2020-02-01 Eindhoven Airport 438828
26 10656.001 2020-03-01 Eindhoven Airport 225071
27 27924.714 2020-04-01 Eindhoven Airport 7732
28 7582.998 2020-05-01 Eindhoven Airport 12108
29 4043.568 2020-06-01 Eindhoven Airport 46774
30 3634.429 2020-07-01 Eindhoven Airport 257515
31 16229.146 2020-08-01 Eindhoven Airport 295053
32 45306.571 2020-09-01 Eindhoven Airport 171375
33 216295.287 2020-10-01 Eindhoven Airport 133057
34 182778.574 2020-11-01 Eindhoven Airport 57737
35 266188.860 2020-12-01 Eindhoven Airport 66544
36 191199.141 2021-01-01 Eindhoven Airport 36128
37 109028.142 2021-02-01 Eindhoven Airport 11314
38 179947.141 2021-03-01 Eindhoven Airport 16000
39 222759.287 2021-04-01 Eindhoven Airport 27805
40 162576.713 2021-05-01 Eindhoven Airport 51798
41 40344.716 2021-06-01 Eindhoven Airport 147608
42 174610.284 2021-07-01 Eindhoven Airport 344808
43 78988.999 2021-08-01 Eindhoven Airport 481576
44 63854.573 2021-09-01 Eindhoven Airport 453527
45 116907.427 2021-10-01 Eindhoven Airport 479966
46 482635.572 2021-11-01 Eindhoven Airport 341640
47 505056.000 2021-12-01 Eindhoven Airport 306254
48 1177889.571 2022-01-01 Eindhoven Airport 275066
49 1987987.427 2022-02-01 Eindhoven Airport 309283
50 1514981.857 2022-03-01 Eindhoven Airport 401775
51 264584.427 2022-04-01 Eindhoven Airport 546389
52 39185.430 2022-05-01 Eindhoven Airport 619540
53 82594.432 2022-06-01 Eindhoven Airport 631700
54 160921.573 2022-07-01 Eindhoven Airport 662646
55 56599.998 2022-08-01 Eindhoven Airport 678848
Correlation at Eindhoven Airport is:
New Cases Total passengers
New Cases 1.000000 -0.173221
Total passengers -0.173221 1.000000
New Cases Periods Airports Total passengers
0 0.000 2018-01-01 Maastricht Aachen Airport 3286
1 0.000 2018-02-01 Maastricht Aachen Airport 3022
2 0.000 2018-03-01 Maastricht Aachen Airport 5502
3 0.000 2018-04-01 Maastricht Aachen Airport 17477
4 0.000 2018-05-01 Maastricht Aachen Airport 34418
5 0.000 2018-06-01 Maastricht Aachen Airport 31299
6 0.000 2018-07-01 Maastricht Aachen Airport 46636
7 0.000 2018-08-01 Maastricht Aachen Airport 53040
8 0.000 2018-09-01 Maastricht Aachen Airport 34945
9 0.000 2018-10-01 Maastricht Aachen Airport 32462
10 0.000 2018-11-01 Maastricht Aachen Airport 7528
11 0.000 2018-12-01 Maastricht Aachen Airport 5498
12 0.000 2019-01-01 Maastricht Aachen Airport 6140
13 0.000 2019-02-01 Maastricht Aachen Airport 6817
14 0.000 2019-03-01 Maastricht Aachen Airport 6914
15 0.000 2019-04-01 Maastricht Aachen Airport 32795
16 0.000 2019-05-01 Maastricht Aachen Airport 49734
17 0.000 2019-06-01 Maastricht Aachen Airport 50048
18 0.000 2019-07-01 Maastricht Aachen Airport 69715
19 0.000 2019-08-01 Maastricht Aachen Airport 76289
20 0.000 2019-09-01 Maastricht Aachen Airport 59255
21 0.000 2019-10-01 Maastricht Aachen Airport 46190
22 0.000 2019-11-01 Maastricht Aachen Airport 16446
23 0.000 2019-12-01 Maastricht Aachen Airport 15634
24 0.000 2020-01-01 Maastricht Aachen Airport 15115
25 0.000 2020-02-01 Maastricht Aachen Airport 14354
26 10656.001 2020-03-01 Maastricht Aachen Airport 7242
27 27924.714 2020-04-01 Maastricht Aachen Airport 5
28 7582.998 2020-05-01 Maastricht Aachen Airport 4
29 4043.568 2020-06-01 Maastricht Aachen Airport 389
30 3634.429 2020-07-01 Maastricht Aachen Airport 12952
31 16229.146 2020-08-01 Maastricht Aachen Airport 16818
32 45306.571 2020-09-01 Maastricht Aachen Airport 5511
33 216295.287 2020-10-01 Maastricht Aachen Airport 4710
34 182778.574 2020-11-01 Maastricht Aachen Airport 2139
35 266188.860 2020-12-01 Maastricht Aachen Airport 1841
36 191199.141 2021-01-01 Maastricht Aachen Airport 1049
37 109028.142 2021-02-01 Maastricht Aachen Airport 448
38 179947.141 2021-03-01 Maastricht Aachen Airport 373
39 222759.287 2021-04-01 Maastricht Aachen Airport 1474
40 162576.713 2021-05-01 Maastricht Aachen Airport 2223
41 40344.716 2021-06-01 Maastricht Aachen Airport 4454
42 174610.284 2021-07-01 Maastricht Aachen Airport 22399
43 78988.999 2021-08-01 Maastricht Aachen Airport 24199
44 63854.573 2021-09-01 Maastricht Aachen Airport 16364
45 116907.427 2021-10-01 Maastricht Aachen Airport 17826
46 482635.572 2021-11-01 Maastricht Aachen Airport 3744
47 505056.000 2021-12-01 Maastricht Aachen Airport 3093
48 1177889.571 2022-01-01 Maastricht Aachen Airport 5880
49 1987987.427 2022-02-01 Maastricht Aachen Airport 3288
50 1514981.857 2022-03-01 Maastricht Aachen Airport 3371
51 264584.427 2022-04-01 Maastricht Aachen Airport 15386
52 39185.430 2022-05-01 Maastricht Aachen Airport 22019
53 82594.432 2022-06-01 Maastricht Aachen Airport 20728
54 160921.573 2022-07-01 Maastricht Aachen Airport 45778
55 56599.998 2022-08-01 Maastricht Aachen Airport 53999
Correlation at Maastricht Aachen Airport is:
New Cases Total passengers
New Cases 1.000000 -0.268272
Total passengers -0.268272 1.000000
New Cases Periods Airports Total passengers
0 0.000 2018-01-01 Groningen Airport Eelde 11514
1 0.000 2018-02-01 Groningen Airport Eelde 10930
2 0.000 2018-03-01 Groningen Airport Eelde 12606
3 0.000 2018-04-01 Groningen Airport Eelde 14847
4 0.000 2018-05-01 Groningen Airport Eelde 26376
5 0.000 2018-06-01 Groningen Airport Eelde 23629
6 0.000 2018-07-01 Groningen Airport Eelde 25712
7 0.000 2018-08-01 Groningen Airport Eelde 28502
8 0.000 2018-09-01 Groningen Airport Eelde 24297
9 0.000 2018-10-01 Groningen Airport Eelde 21192
10 0.000 2018-11-01 Groningen Airport Eelde 15204
11 0.000 2018-12-01 Groningen Airport Eelde 13889
12 0.000 2019-01-01 Groningen Airport Eelde 8244
13 0.000 2019-02-01 Groningen Airport Eelde 8771
14 0.000 2019-03-01 Groningen Airport Eelde 9541
15 0.000 2019-04-01 Groningen Airport Eelde 13622
16 0.000 2019-05-01 Groningen Airport Eelde 22217
17 0.000 2019-06-01 Groningen Airport Eelde 20981
18 0.000 2019-07-01 Groningen Airport Eelde 19813
19 0.000 2019-08-01 Groningen Airport Eelde 21459
20 0.000 2019-09-01 Groningen Airport Eelde 20756
21 0.000 2019-10-01 Groningen Airport Eelde 16210
22 0.000 2019-11-01 Groningen Airport Eelde 7341
23 0.000 2019-12-01 Groningen Airport Eelde 7067
24 0.000 2020-01-01 Groningen Airport Eelde 5290
25 0.000 2020-02-01 Groningen Airport Eelde 4587
26 10656.001 2020-03-01 Groningen Airport Eelde 1999
27 27924.714 2020-04-01 Groningen Airport Eelde 0
28 7582.998 2020-05-01 Groningen Airport Eelde 47
29 4043.568 2020-06-01 Groningen Airport Eelde 0
30 3634.429 2020-07-01 Groningen Airport Eelde 2723
31 16229.146 2020-08-01 Groningen Airport Eelde 2231
32 45306.571 2020-09-01 Groningen Airport Eelde 589
33 216295.287 2020-10-01 Groningen Airport Eelde 62
34 182778.574 2020-11-01 Groningen Airport Eelde 0
35 266188.860 2020-12-01 Groningen Airport Eelde 0
36 191199.141 2021-01-01 Groningen Airport Eelde 0
37 109028.142 2021-02-01 Groningen Airport Eelde 0
38 179947.141 2021-03-01 Groningen Airport Eelde 0
39 222759.287 2021-04-01 Groningen Airport Eelde 0
40 162576.713 2021-05-01 Groningen Airport Eelde 0
41 40344.716 2021-06-01 Groningen Airport Eelde 694
42 174610.284 2021-07-01 Groningen Airport Eelde 4119
43 78988.999 2021-08-01 Groningen Airport Eelde 4475
44 63854.573 2021-09-01 Groningen Airport Eelde 6212
45 116907.427 2021-10-01 Groningen Airport Eelde 4794
46 482635.572 2021-11-01 Groningen Airport Eelde 3455
47 505056.000 2021-12-01 Groningen Airport Eelde 3511
48 1177889.571 2022-01-01 Groningen Airport Eelde 3666
49 1987987.427 2022-02-01 Groningen Airport Eelde 3436
50 1514981.857 2022-03-01 Groningen Airport Eelde 3306
51 264584.427 2022-04-01 Groningen Airport Eelde 5010
52 39185.430 2022-05-01 Groningen Airport Eelde 8746
53 82594.432 2022-06-01 Groningen Airport Eelde 9400
54 160921.573 2022-07-01 Groningen Airport Eelde 11314
55 56599.998 2022-08-01 Groningen Airport Eelde 13390
Correlation at Groningen Airport Eelde is:
New Cases Total passengers
New Cases 1.000000 -0.289785
Total passengers -0.289785 1.000000
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:26: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\3967105851.py:27: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
# Exclude months with zero Covid cases (PRE-COVID)
# Create year and month columns and groupby
df_cases = covid_nl_clean_df.copy()
df_cases['year'] = pd.DatetimeIndex(df_cases['date']).year
df_cases['month'] = pd.DatetimeIndex(df_cases['date']).month
df_cases = df_cases.groupby(by=['year', 'month']).agg({'new_cases_smoothed':
'sum'})
# Delete 2022-09 & 2022-10, since no airport-data available for these months
# Remove multi-index from groupby
df_cases = df_cases.iloc[:-2]
df_test = df_cases.reset_index()
# Loop through airports and get correlation of #cases/month in the Netherlands with #passenger/month at certain airport
for i in at_df_timespan_corr['Airports'].unique().tolist():
# Take only airport of interest
df_temp = at_df_timespan_corr[at_df_timespan_corr['Airports']==i]
# Create year and month variable
df_temp['year'] = pd.DatetimeIndex(df_temp['Periods']).year
df_temp['month'] = pd.DatetimeIndex(df_temp['Periods']).month
# Merge 'new cases' and 'flights per airport' on year and month
df_temp = df_temp.reset_index(drop=True)
df_concat = df_temp.merge(df_test,on=['year', 'month'],how='outer')
# Rename columns for convenience
df_concat.columns = ['Periods', 'Airports', 'Total passengers','year',
'month', 'New Cases']
# Fill 'New cases column' with 0 cases, if NaN (so before '2022-03')
df_concat['New Cases'] = df_concat['New Cases'].fillna(0)
# If you data only from '2020-03-01' (Uncomment this for second case)
df_concat=df_concat[df_concat['Periods']>='2020-03-01']
# If you want to print your data (Uncomment this for second case)
print(df_concat[['New Cases', 'Periods', 'Airports', 'Total passengers']])
print('Correlation at', i, 'is: ')
print(df_concat[['New Cases','Total passengers']].corr())
print(' ')
New Cases Periods Airports Total passengers
26 10656.001 2020-03-01 Total Dutch airports 2773554
27 27924.714 2020-04-01 Total Dutch airports 133752
28 7582.998 2020-05-01 Total Dutch airports 220120
29 4043.568 2020-06-01 Total Dutch airports 526544
30 3634.429 2020-07-01 Total Dutch airports 1690515
31 16229.146 2020-08-01 Total Dutch airports 2242935
32 45306.571 2020-09-01 Total Dutch airports 1547263
33 216295.287 2020-10-01 Total Dutch airports 1303123
34 182778.574 2020-11-01 Total Dutch airports 965071
35 266188.860 2020-12-01 Total Dutch airports 1306018
36 191199.141 2021-01-01 Total Dutch airports 909617
37 109028.142 2021-02-01 Total Dutch airports 519827
38 179947.141 2021-03-01 Total Dutch airports 676647
39 222759.287 2021-04-01 Total Dutch airports 817876
40 162576.713 2021-05-01 Total Dutch airports 1169673
41 40344.716 2021-06-01 Total Dutch airports 1870330
42 174610.284 2021-07-01 Total Dutch airports 3515159
43 78988.999 2021-08-01 Total Dutch airports 4479180
44 63854.573 2021-09-01 Total Dutch airports 4013477
45 116907.427 2021-10-01 Total Dutch airports 4395945
46 482635.572 2021-11-01 Total Dutch airports 3492940
47 505056.000 2021-12-01 Total Dutch airports 3208864
48 1177889.571 2022-01-01 Total Dutch airports 2831598
49 1987987.427 2022-02-01 Total Dutch airports 3040193
50 1514981.857 2022-03-01 Total Dutch airports 4241663
51 264584.427 2022-04-01 Total Dutch airports 5140680
52 39185.430 2022-05-01 Total Dutch airports 6092054
53 82594.432 2022-06-01 Total Dutch airports 6118527
54 160921.573 2022-07-01 Total Dutch airports 6211931
55 56599.998 2022-08-01 Total Dutch airports 6378969
Correlation at Total Dutch airports is:
New Cases Total passengers
New Cases 1.000000 0.119809
Total passengers 0.119809 1.000000
New Cases Periods Airports Total passengers
26 10656.001 2020-03-01 Amsterdam Airport Schiphol 2476372
27 27924.714 2020-04-01 Amsterdam Airport Schiphol 126015
28 7582.998 2020-05-01 Amsterdam Airport Schiphol 207827
29 4043.568 2020-06-01 Amsterdam Airport Schiphol 471410
30 3634.429 2020-07-01 Amsterdam Airport Schiphol 1338857
31 16229.146 2020-08-01 Amsterdam Airport Schiphol 1854786
32 45306.571 2020-09-01 Amsterdam Airport Schiphol 1337741
33 216295.287 2020-10-01 Amsterdam Airport Schiphol 1143483
34 182778.574 2020-11-01 Amsterdam Airport Schiphol 900434
35 266188.860 2020-12-01 Amsterdam Airport Schiphol 1233043
36 191199.141 2021-01-01 Amsterdam Airport Schiphol 869129
37 109028.142 2021-02-01 Amsterdam Airport Schiphol 505194
38 179947.141 2021-03-01 Amsterdam Airport Schiphol 660176
39 222759.287 2021-04-01 Amsterdam Airport Schiphol 786652
40 162576.713 2021-05-01 Amsterdam Airport Schiphol 1106740
41 40344.716 2021-06-01 Amsterdam Airport Schiphol 1678265
42 174610.284 2021-07-01 Amsterdam Airport Schiphol 3029951
43 78988.999 2021-08-01 Amsterdam Airport Schiphol 3786973
44 63854.573 2021-09-01 Amsterdam Airport Schiphol 3370205
45 116907.427 2021-10-01 Amsterdam Airport Schiphol 3745991
46 482635.572 2021-11-01 Amsterdam Airport Schiphol 3095823
47 505056.000 2021-12-01 Amsterdam Airport Schiphol 2855711
48 1177889.571 2022-01-01 Amsterdam Airport Schiphol 2488083
49 1987987.427 2022-02-01 Amsterdam Airport Schiphol 2660676
50 1514981.857 2022-03-01 Amsterdam Airport Schiphol 3732048
51 264584.427 2022-04-01 Amsterdam Airport Schiphol 4434587
52 39185.430 2022-05-01 Amsterdam Airport Schiphol 5217035
53 82594.432 2022-06-01 Amsterdam Airport Schiphol 5232630
54 160921.573 2022-07-01 Amsterdam Airport Schiphol 5179725
55 56599.998 2022-08-01 Amsterdam Airport Schiphol 5327361
Correlation at Amsterdam Airport Schiphol is:
New Cases Total passengers
New Cases 1.000000 0.136939
Total passengers 0.136939 1.000000
New Cases Periods Airports Total passengers
26 10656.001 2020-03-01 Rotterdam The Hague Airport 62870
27 27924.714 2020-04-01 Rotterdam The Hague Airport 0
28 7582.998 2020-05-01 Rotterdam The Hague Airport 134
29 4043.568 2020-06-01 Rotterdam The Hague Airport 7971
30 3634.429 2020-07-01 Rotterdam The Hague Airport 78468
31 16229.146 2020-08-01 Rotterdam The Hague Airport 74047
32 45306.571 2020-09-01 Rotterdam The Hague Airport 32047
33 216295.287 2020-10-01 Rotterdam The Hague Airport 21811
34 182778.574 2020-11-01 Rotterdam The Hague Airport 4761
35 266188.860 2020-12-01 Rotterdam The Hague Airport 4590
36 191199.141 2021-01-01 Rotterdam The Hague Airport 3311
37 109028.142 2021-02-01 Rotterdam The Hague Airport 2871
38 179947.141 2021-03-01 Rotterdam The Hague Airport 98
39 222759.287 2021-04-01 Rotterdam The Hague Airport 1945
40 162576.713 2021-05-01 Rotterdam The Hague Airport 8912
41 40344.716 2021-06-01 Rotterdam The Hague Airport 39309
42 174610.284 2021-07-01 Rotterdam The Hague Airport 113882
43 78988.999 2021-08-01 Rotterdam The Hague Airport 181957
44 63854.573 2021-09-01 Rotterdam The Hague Airport 167169
45 116907.427 2021-10-01 Rotterdam The Hague Airport 147368
46 482635.572 2021-11-01 Rotterdam The Hague Airport 48278
47 505056.000 2021-12-01 Rotterdam The Hague Airport 40295
48 1177889.571 2022-01-01 Rotterdam The Hague Airport 58903
49 1987987.427 2022-02-01 Rotterdam The Hague Airport 63510
50 1514981.857 2022-03-01 Rotterdam The Hague Airport 101163
51 264584.427 2022-04-01 Rotterdam The Hague Airport 139308
52 39185.430 2022-05-01 Rotterdam The Hague Airport 224714
53 82594.432 2022-06-01 Rotterdam The Hague Airport 224069
54 160921.573 2022-07-01 Rotterdam The Hague Airport 312468
55 56599.998 2022-08-01 Rotterdam The Hague Airport 305371
Correlation at Rotterdam The Hague Airport is:
New Cases Total passengers
New Cases 1.000000 -0.073068
Total passengers -0.073068 1.000000
New Cases Periods Airports Total passengers
26 10656.001 2020-03-01 Eindhoven Airport 225071
27 27924.714 2020-04-01 Eindhoven Airport 7732
28 7582.998 2020-05-01 Eindhoven Airport 12108
29 4043.568 2020-06-01 Eindhoven Airport 46774
30 3634.429 2020-07-01 Eindhoven Airport 257515
31 16229.146 2020-08-01 Eindhoven Airport 295053
32 45306.571 2020-09-01 Eindhoven Airport 171375
33 216295.287 2020-10-01 Eindhoven Airport 133057
34 182778.574 2020-11-01 Eindhoven Airport 57737
35 266188.860 2020-12-01 Eindhoven Airport 66544
36 191199.141 2021-01-01 Eindhoven Airport 36128
37 109028.142 2021-02-01 Eindhoven Airport 11314
38 179947.141 2021-03-01 Eindhoven Airport 16000
39 222759.287 2021-04-01 Eindhoven Airport 27805
40 162576.713 2021-05-01 Eindhoven Airport 51798
41 40344.716 2021-06-01 Eindhoven Airport 147608
42 174610.284 2021-07-01 Eindhoven Airport 344808
43 78988.999 2021-08-01 Eindhoven Airport 481576
44 63854.573 2021-09-01 Eindhoven Airport 453527
45 116907.427 2021-10-01 Eindhoven Airport 479966
46 482635.572 2021-11-01 Eindhoven Airport 341640
47 505056.000 2021-12-01 Eindhoven Airport 306254
48 1177889.571 2022-01-01 Eindhoven Airport 275066
49 1987987.427 2022-02-01 Eindhoven Airport 309283
50 1514981.857 2022-03-01 Eindhoven Airport 401775
51 264584.427 2022-04-01 Eindhoven Airport 546389
52 39185.430 2022-05-01 Eindhoven Airport 619540
53 82594.432 2022-06-01 Eindhoven Airport 631700
54 160921.573 2022-07-01 Eindhoven Airport 662646
55 56599.998 2022-08-01 Eindhoven Airport 678848
Correlation at Eindhoven Airport is:
New Cases Total passengers
New Cases 1.000000 0.086192
Total passengers 0.086192 1.000000
New Cases Periods Airports Total passengers
26 10656.001 2020-03-01 Maastricht Aachen Airport 7242
27 27924.714 2020-04-01 Maastricht Aachen Airport 5
28 7582.998 2020-05-01 Maastricht Aachen Airport 4
29 4043.568 2020-06-01 Maastricht Aachen Airport 389
30 3634.429 2020-07-01 Maastricht Aachen Airport 12952
31 16229.146 2020-08-01 Maastricht Aachen Airport 16818
32 45306.571 2020-09-01 Maastricht Aachen Airport 5511
33 216295.287 2020-10-01 Maastricht Aachen Airport 4710
34 182778.574 2020-11-01 Maastricht Aachen Airport 2139
35 266188.860 2020-12-01 Maastricht Aachen Airport 1841
36 191199.141 2021-01-01 Maastricht Aachen Airport 1049
37 109028.142 2021-02-01 Maastricht Aachen Airport 448
38 179947.141 2021-03-01 Maastricht Aachen Airport 373
39 222759.287 2021-04-01 Maastricht Aachen Airport 1474
40 162576.713 2021-05-01 Maastricht Aachen Airport 2223
41 40344.716 2021-06-01 Maastricht Aachen Airport 4454
42 174610.284 2021-07-01 Maastricht Aachen Airport 22399
43 78988.999 2021-08-01 Maastricht Aachen Airport 24199
44 63854.573 2021-09-01 Maastricht Aachen Airport 16364
45 116907.427 2021-10-01 Maastricht Aachen Airport 17826
46 482635.572 2021-11-01 Maastricht Aachen Airport 3744
47 505056.000 2021-12-01 Maastricht Aachen Airport 3093
48 1177889.571 2022-01-01 Maastricht Aachen Airport 5880
49 1987987.427 2022-02-01 Maastricht Aachen Airport 3288
50 1514981.857 2022-03-01 Maastricht Aachen Airport 3371
51 264584.427 2022-04-01 Maastricht Aachen Airport 15386
52 39185.430 2022-05-01 Maastricht Aachen Airport 22019
53 82594.432 2022-06-01 Maastricht Aachen Airport 20728
54 160921.573 2022-07-01 Maastricht Aachen Airport 45778
55 56599.998 2022-08-01 Maastricht Aachen Airport 53999
Correlation at Maastricht Aachen Airport is:
New Cases Total passengers
New Cases 1.000000 -0.211452
Total passengers -0.211452 1.000000
New Cases Periods Airports Total passengers
26 10656.001 2020-03-01 Groningen Airport Eelde 1999
27 27924.714 2020-04-01 Groningen Airport Eelde 0
28 7582.998 2020-05-01 Groningen Airport Eelde 47
29 4043.568 2020-06-01 Groningen Airport Eelde 0
30 3634.429 2020-07-01 Groningen Airport Eelde 2723
31 16229.146 2020-08-01 Groningen Airport Eelde 2231
32 45306.571 2020-09-01 Groningen Airport Eelde 589
33 216295.287 2020-10-01 Groningen Airport Eelde 62
34 182778.574 2020-11-01 Groningen Airport Eelde 0
35 266188.860 2020-12-01 Groningen Airport Eelde 0
36 191199.141 2021-01-01 Groningen Airport Eelde 0
37 109028.142 2021-02-01 Groningen Airport Eelde 0
38 179947.141 2021-03-01 Groningen Airport Eelde 0
39 222759.287 2021-04-01 Groningen Airport Eelde 0
40 162576.713 2021-05-01 Groningen Airport Eelde 0
41 40344.716 2021-06-01 Groningen Airport Eelde 694
42 174610.284 2021-07-01 Groningen Airport Eelde 4119
43 78988.999 2021-08-01 Groningen Airport Eelde 4475
44 63854.573 2021-09-01 Groningen Airport Eelde 6212
45 116907.427 2021-10-01 Groningen Airport Eelde 4794
46 482635.572 2021-11-01 Groningen Airport Eelde 3455
47 505056.000 2021-12-01 Groningen Airport Eelde 3511
48 1177889.571 2022-01-01 Groningen Airport Eelde 3666
49 1987987.427 2022-02-01 Groningen Airport Eelde 3436
50 1514981.857 2022-03-01 Groningen Airport Eelde 3306
51 264584.427 2022-04-01 Groningen Airport Eelde 5010
52 39185.430 2022-05-01 Groningen Airport Eelde 8746
53 82594.432 2022-06-01 Groningen Airport Eelde 9400
54 160921.573 2022-07-01 Groningen Airport Eelde 11314
55 56599.998 2022-08-01 Groningen Airport Eelde 13390
Correlation at Groningen Airport Eelde is:
New Cases Total passengers
New Cases 1.000000 0.014651
Total passengers 0.014651 1.000000
C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:23: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\zijlm\AppData\Local\Temp\ipykernel_29632\2244539678.py:24: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
The research question of this report was: ‘How did Covid-19 affect the passenger air traffic in the Netherlands?’. For answering the research question, four sub questions have been identified.
The first sub-question was as follows: ‘How was the number of new Covid-19 cases developed in the considered time in the Netherlands?’. The hypothesis, that the development of new Covid-19 cases is dependent on seasonality and government regulations, has been confirmed. Analysis of the new Covid-19 cases showed that the number of cases tended to decrease during summer and increase during winter. Analysis of the new cases in relation to the regulations showed that after stricter government regulations, the number of cases first slightly increased, followed by a decrease.
The second sub-question was: ‘How was the number of air traffic passengers developed in the considered time and spatial scope?’ The associated hypothesis was that it was related to government regulations for Covid-19. This hypothesis is confirmed. The biggest drop in passengers occurred in February-March 2020, corresponding to the introduction of a no-fly zone. Other significant movements in number of passengers can also be explained by the active measures at the time.
The third sub-question conducted in order to answer the research question was: ‘Are there relative differences in the development of air traffic passengers between the considered airports in the Netherlands?’. The hypothesis was that there will be only small differences in 2019 compared to 2018. Given the impactful measures around February/March 2020, a large drop in passenger numbers, equally felt by all airports, is expected. In addition, it is expected that airports with a relatively high number of local flights will ultimately have been affected the least, as they are less dependent on restrictions related to international travel. The analysis showed that the total number of air passengers in the Netherlands is currently at 82% of pre-COVID levels. The number of passengers at Rotterdam The Hague Airport, Eindhoven Airport and Maastricht Aachen Airport are currently even above pre-COVID levels. However, against expectations, Groningen Airport Eelde has experienced the largest decrease in passenger numbers (currently at 47% of pre-COVID levels). Therefore, the hypothesis is rejected.
Finally the last sub-question was answered: ‘How has Covid-19 impacted air traffic from and to various regions / continents?’. The hypothesis was that the number of air passengers on intercontinental flights has been more affected than the number of passengers on European flights. The hypothesis is partly confirmed as the effect on European flights compared to intercontinental flights varied over time. This could be explained by regular bans on flights to specific parts of the world as well as parts of Europe and changing consumer preferences (e.g. increased preference for intercontinental travel after COVID-19). It is also notable that, at this moment, Europe is further down pre-COVID levels than Africa and South/Middle America. Therefore, the hypothesis is partly confirmed.
After answering the sub questions, a correlation test has been performed. The correlations that were found are not representative for the relationship between the COVID-19 cases and number of air passengers. Therefore, these have not been taken into account for answering the research question.
It can be concluded that COVID-19 significantly affected passenger air traffic. Government measures directly impacted the number of air passengers and therefore passenger air traffic collapsed at the beginning of COVID-19. Recovery is ongoing with the total Dutch air passenger traffic currently at 82% of pre-Covid levels. Interestingly, air traffic related to Asia clearly lags behind in recovery. Also, Europe is currently behind the Americas and Africa.
In this section, the discussion points will be discussed to evaluate the feasibility and reliability of the research. First, the COVID-19 cases at the beginning of the pandemic were unknown or unreliable in the Netherlands. Especially in the time February 2020, when the first infection occurred, until June 2020. Not until June it was possible for every citizen with symptoms to take a test. Thus, before this time, not all the positive tests were registered. This should be contemplated when considering the data on COVID-19 infections available. However, this is not included in measuring the correlation and is therefore not very reliable.
Secondly, although the effect of seasonality is included within the discussions of analyzing the graphs, it was not possible to include this in measuring the correlation since this is purely based on hard data. During summertime people will tend to travel more and the infections will tend to be less. Therefore, this will yield conflicting results when it comes to correlation.
The external factors outside the scope are last discussion points that should be considered. Aspects like high costs of flights, inflation, recession, ethics and fear of COVID-19 or personnel shortages are features that play a role in the amount of air traffic passengers in the Netherlands. Especially the fear of COVID-19, ethics and opinions of others have been reasons for a large amount of people not to travel. Moreover, for example people that have lost their jobs during COVID times, might have changed their travel behavior as well. These are also aspects that affect the results on amount of air traffic passengers a lot and should be considered in the conclusion.
Eva Lijnen: Subquestion 2, overall text writing, references, discussion.
Chaja Schwab: Subquestion 1 and 4, conclusion.
Willemijn Dietz: Subquestion 2, 3 and 4, correlation.
Veerle van Citters: Subquestion 3, overall text writing, discussion.
Noa Zijlmans: Subquestion 1 and 4, overall PEP-8 check, conclusion.
Centraal Bureau voor de Statistiek. (2019, June 28). Lichte groei aantal passagiers Nederlandse luchthavens. Retrieved from https://www.cbs.nl/nl-nl/nieuws/2019/26/lichte-groei-aantal-passagiers-nederlandse-luchthavens
Centraal Bureau voor de Statistiek. (2022, November 8). Aviation; monthly figures of Dutch airports. Retrieved from https://opendata.cbs.nl/statline/#/CBS/en/dataset/37478eng/table?ts=1664959088541
Mathieu, E. , Ritchie, H., Rodés-Guirao, L., Appel, C., Giattino, C., Hasell, J., Macdonald, B., Dattani, S., Beltekian, D., Ortiz-Ospina, E., and Roser, M. (2020) - "Coronavirus Pandemic (COVID-19)". Published online at OurWorldInData.org. Retrieved from 'https://ourworldindata.org/coronavirus'
Ministerie van Algemene Zaken. (2022, September 26). Januari 2020: Eerste signalen corona. Coronavirus Tijdlijn | Rijksoverheid.nl. Retrieved from https://www.rijksoverheid.nl/onderwerpen/coronavirus-tijdlijn/januari-2020-eerste-signalen-corona
Ministerie van Algemene Zaken (2022, June 14). Ontwikkelingen coronavirus in 2022 - Coronavirus tijdlijn - Rijksoverheid.nl. Retrieved from Www.rijksoverheid.nl. https://www.rijksoverheid.nl/onderwerpen/coronavirus-tijdlijn/2022
NOS. (2022, January 6). Die duizenden lege vluchten zijn volgens luchthavenkoepel helemaal niet nodig. NOS.nl. Retrieved from https://nos.nl/artikel/2412154-die-duizenden-lege-vluchten-zijn-volgens-luchthavenkoepel-helemaal-niet-nodig
Regionale luchthavens. (n.d.). Toekomst Luchtvaart. Retrieved from https://www.luchtvaartindetoekomst.nl/luchthavens/regionale+luchthavens/default.aspx
RIVM. (n.d.). Tijdlijn van coronamaatregelen. Retrieved from https://www.rivm.nl/gedragsonderzoek/tijdlijn-maatregelen-covid
Below, an extensive overview of COVID-19 regulations, between February 2020 until May 2022, is described (Ministerie van Algmenene Zaken, 2022). There will only be focused on flights/ airport regulations.